Как я могу показать диалог «Открыть с»?

Есть ли простой способ открыть диалоговое окно «Открыть с»?

Некоторое обратное проектирование с ProcExp показало рабочую строку rundll32.exe. Вот пример программы, которая его использует:

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

Протестировано на Win7, я не могу догадаться, насколько хорошо это будет работать в других версиях Windows.

Это должно сделать трюк …

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

Хотя Одед делает большой вывод – не зная точно, как / где вы собираетесь использовать такую ​​функциональность, это может не быть ответом на вашу ситуацию.

Последние комментарии к этому ответу показывают, что я был не очень подробным в первую очередь. Проблема будет возникать, если вы попытаетесь openas файл, у которого уже есть open глагол, определенный для этого типа файла. Аналогичным образом, если вы попытаетесь open файл, который не имеет определенного глагола, возникнут проблемы. Этот вопрос будет:

Win32Exception: приложение не связано с указанным файлом для этой операции

В верхней части моей головы я предложил Томасу, чтобы использовать этот вид кода в производственном приложении, вам нужно быть основательным и, возможно, проверять реестр или иным образом выяснять, можно или не открывать файл с помощью любой данный глагол. Это может быть проще, если вы рассмотрите ProcessStartInfo.Verbs : это, как только имя fileName будет установлено, предоставит вам набор возможных глаголов, связанных с типом файла. Это должно облегчить определение того, что делать с каким файлом.

Чтобы обернуть, как я упомянул Томасу, вам нужно будет позаботиться и добавить некоторую сложность / интеллект в ваше приложение – этот ответ, безусловно, не является решающим решением.

С помощью

 System.Diagnostics.Process.Start(path); 

Файл будет открыт с помощью программы по умолчанию, если программа по умолчанию не определена, откроется диалог открытия с диалоговым окном.

Вы можете использовать функцию:

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

У вас есть пример, чтобы использовать эту функцию: эта ссылка

В схеме кода « Все в одном» представлено множество примеров оболочек . Возможно, вы можете взглянуть на них, чтобы увидеть, есть ли у примера функции, которые вы хотите иметь.

  • Общие рекомендации по предотвращению утечек памяти на C ++
  • Сериализовать статический class?
  • Ошибка отладки! Выражение: __acrt_first_block == header
  • Получение «типа или имени пространства имен не удалось найти», но все выглядит нормально?
  • Почему C # C ++ не имеет «стандартного стандарта ISO»?
  • Каков самый простой способ генерации xml в c ++?
  • Компиляция Visual Studio 2010 с версией отладки или выпуска сторонней библиотеки в зависимости от того, скомпилирован ли мой проект Build или Release?
  • Как создать изображение из текста на лету во время выполнения
  • Как выполнить функтор или lambda в заданном streamе в Qt, GCD-стиле?
  • Есть ли какой-либо синтаксический анализатор строк в C #?
  • Как я могу программно создавать, читать, писать excel без установки офиса?
  • Давайте будем гением компьютера.