Есть ли какой-либо простой способ открыть диалог "Открыть с"?
Как я могу показать диалог "Открыть с"?
Ответ 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. Возможно, вы можете взглянуть на них, чтобы увидеть, есть ли у примера функции, которые вы хотите иметь.