Подтвердить что ты не робот

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

Есть ли какой-либо простой способ открыть диалог "Открыть с"?

4b9b3361

Ответ 1

Некоторая обратная инженерия с 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.

Ответ 2

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

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

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

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

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

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

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

Ответ 3

Используя

System.Diagnostics.Process.Start(path);

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

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

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

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

Ответ 4

Есть тонны примеры оболочки в All In One Code Framework. Возможно, вы можете взглянуть на них, чтобы увидеть, есть ли у примера функции, которые вы хотите иметь.