Comment afficher la boîte de dialog «Ouvrir avec»?

Existe-t-il un moyen simple d’ouvrir la boîte de dialog de fichier “Ouvrir avec”?

Certaines opérations de reverse engineering avec ProcExp ont révélé une ligne de commande rundll32.exe qui fonctionnait. Voici un exemple de programme qui l’utilise:

 using System; using System.Diagnostics; using System.IO; class Program { static void Main(ssortingng[] args) { ShowOpenWithDialog(@"c:\temp\test.txt"); } public static void ShowOpenWithDialog(ssortingng path) { var args = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "shell32.dll"); args += ",OpenAs_RunDLL " + path; Process.Start("rundll32.exe", args); } } 

Testé sur Win7, je ne peux pas deviner à quel point cela fonctionnera sous d’autres versions de Windows.

Cela devrait faire l’affaire …

 var processInfo = new ProcessStartInfo(fileName); processInfo.Verb = "openas"; Process.Start(processInfo); 

Cependant, Oded fait un bon point – ne pas savoir exactement comment / où vous comptez utiliser une telle fonctionnalité signifie que cela pourrait ne pas être la solution à votre situation.

Les commentaires récents sur cette réponse vont montrer que je n’étais pas très détaillé au départ. Un problème se posera si vous essayez d’ openas un fichier dont le verbe open est déjà défini par rapport à ce type de fichier. De même, si vous essayez d’ open un fichier qui n’a pas défini ce verbe, vous rencontrerez des problèmes. La question serait:

Win32Exception: aucune application n’est associée au fichier spécifié pour cette opération.

J’ai immédiatement suggéré à Thomas que, pour utiliser ce type de code dans une application de production, il fallait être minutieux et peut-être vérifier le registre, ou sinon rechercher si un fichier peut et doit être ouvert avec n’importe quel verbe. Cela pourrait être plus simple que cela en considérant ProcessStartInfo.Verbs : cela, une fois que le nom de fileName est défini, vous fournira une collection de verbes possibles associés au type de fichier. Cela devrait permettre de déterminer plus facilement quoi faire avec quel fichier.

Pour terminer, comme je l’ai dit à Thomas, vous devrez faire preuve de prudence et append un peu de complexité / intelligence à votre application – cette réponse n’est certainement pas une solution miracle.

En utilisant

 System.Diagnostics.Process.Start(path); 

Le fichier sera ouvert avec le programme par défaut. Si aucun programme par défaut n’est défini, la boîte de dialog Ouvrir avec s’affiche.

Vous pouvez utiliser la fonction:

 [DllImport("shell32.dll", SetLastError = true)] extern public static bool ShellExecuteEx(ref ShellExecuteInfo lpExecInfo); 

Vous avez un exemple pour utiliser cette fonction sur: ce lien

Il existe des tonnes d’ exemples de shell dans le cadre de code Tout-en-un . Vous pouvez peut-être les consulter pour voir si un exemple contient des fonctions que vous souhaitez.