Normalmente è una operazione che si fa in fase di installazione, e già il progetto di setup di VSNET consente di farlo, ma ora voglio provarlo a fare da codice: creare una mia estensione, associargli un mio programma e la relativa icona.

Tutto sta nello scrivere le corrette chiavi di registro:

// registro l'estensione Registry.ClassesRoot.CreateSubKey(".babba").SetValue( "", Application.ProductName, Microsoft.Win32.RegistryValueKind.String); // programma ed icona predefiniti Registry.ClassesRoot.CreateSubKey(Application.ProductName + "\\shell\\open\\command").SetValue("", "\"" + Application.ExecutablePath + "\" \"%1\"", Microsoft.Win32.RegistryValueKind.String); Registry.ClassesRoot.CreateSubKey(Application.ProductName + "\\DefaultIcon").SetValue("", Application.ExecutablePath + ",0", Microsoft.Win32.RegistryValueKind.String);

Adesso tutti i files con estensione ".babba" avranno la mia icona e se li apro partirà il mio programmino. Il primo argomento conterrà il path del file che sto aprendo.

static class Program { [STAThread] static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); if (args.Length > 0) Application.Run(new Shell(args[0])); else Application.Run(new Shell()); } }

Per refreshare windows in modo che un file con la ns. nuova estensione risenta dei cambiamente e ad esempio visualizzi l'icona corretta bisogna ricorrere a SHChangeNotify (shell32)

[DllImport("shell32.dll")] static extern void SHChangeNotify(HChangeNotifyEventID wEventId, HChangeNotifyFlags uFlags, IntPtr dwItem1, IntPtr dwItem2);

Ecco la rimozione dell'estensione e dell'associazione al ns. programma:

// rimuovo estensione e programma predefinito Registry.ClassesRoot.DeleteSubKeyTree(".babba"); Registry.ClassesRoot.DeleteSubKeyTree(Application.ProductName); // refresh SHChangeNotify(HChangeNotifyEventID.SHCNE_ASSOCCHANGED, HChangeNotifyFlags.SHCNF_IDLIST, IntPtr.Zero, IntPtr.Zero);

Ultima nota riguarda i permessi: operando sul registry è necessario essere amministratori, cosa che in Vista si può forzare embeddando il manifest come ho già postato qui.