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.