17/06/2008

Associer une extension de fichier à un exécutable

Cette article est une adaptation en C# de l'article (http://www.c2i.fr/code.aspx?IDCode=420) de Richard Clarck (http://www.c2i.fr/).

Comme le titre l'indique, le but est d'associer une extension de fichier à programme qui sera utilisé pour consulter/modifier les documents ayant cette extension. Il se compose principalement des méthodes suivantes :

  • RegisterShellExtension
  • UnRegisterShellExtension
  • CheckRegisterShellExtension
public const Int32 SHCNE_ASSOCCHANGED = 0x8000000;
public const Int32 SHCNF_IDLIST = 0x0;

[DllImport("shell32.dll")]
public static extern void SHChangeNotify(Int32 wEventId, UInt32 uFlags, UInt32 dwItem1, UInt32 dwItem2);

///
/// Enregistre l'extension de fichier XDF comme devant être ouvert par le programme ContractViewer
///

private static void RegisterShellExtension()
{
try
{
// Association entre l'extesion et le programme
RegistryKey oRegKey = Registry.ClassesRoot;
oRegKey = oRegKey.CreateSubKey(".xdf", RegistryKeyPermissionCheck.ReadWriteSubTree);
oRegKey.SetValue("", "ContractViewer Document");
oRegKey.Close();

// Extension du shell pour le programme ContractViewer
oRegKey = Registry.ClassesRoot;
RegistryKey oRegKeyOpenCommand;
oRegKeyOpenCommand = oRegKey.CreateSubKey(@"ContractViewer Document\shell\open\command", RegistryKeyPermissionCheck.ReadWriteSubTree);
oRegKeyOpenCommand.SetValue("", Application.ExecutablePath + " %1");
oRegKeyOpenCommand.Close();

// Association icone pour extension
RegistryKey oRegKeyDefaultIcon;
oRegKeyDefaultIcon = oRegKey.CreateSubKey(@"ContractViewer Document\DefaultIcon", RegistryKeyPermissionCheck.ReadWriteSubTree);
String sICO = Application.StartupPath + @"\app.ico";
oRegKeyDefaultIcon.SetValue("", sICO);
oRegKeyDefaultIcon.Close();

oRegKey.Close();

SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0);
}
catch
{
}
}

///
/// Supprime l'extension de fichier XDF comme devant être ouvert par le programme ContractViewer
///

private static void UnRegisterShellExtension()
{
if (CheckRegisterShellExtension() == false) return; // Rien à supprimer

RegistryKey oRegKey;
try
{
oRegKey = Registry.ClassesRoot;
oRegKey.DeleteSubKeyTree(".xdf");
oRegKey.Close();
}
catch
{
}

try
{
oRegKey = Registry.ClassesRoot;
oRegKey.DeleteSubKeyTree(@"ContractViewer Document");
oRegKey.Close();
}
catch
{
}

SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0);
}

///
/// Verifie si la ShellExtension de ContractViewer est en place.
///

/// True si la shell extension de ContractViewer est en place
private static bool CheckRegisterShellExtension()
{
RegistryKey oRegKey = Registry.ClassesRoot;
oRegKey = oRegKey.OpenSubKey(".xdf",false);
if (oRegKey == null) return false;
oRegKey.Close();

oRegKey = Registry.ClassesRoot;
oRegKey = oRegKey.OpenSubKey("ContractViewer Document", false);
if (oRegKey == null) return false;
oRegKey.Close();

return true;
}

Aucun commentaire: