C# Process.Start() не возвращает правильный ответ
Я разрабатываю программу, где пользователь может запустить любое приложение из программы. Программа будет хранить идентификатор процесса запущенного приложения, поэтому она может завершить его, когда пользователь захочет.
Process application = new Process();
application.StartInfo.FileName = txtApplicationToOpen.Text;
if (application.Start())
{
Debug.WriteLine("started");
lstCurrentlyOpenApplications.Items.Add(txtApplicationToOpen.Text);
_openApplications.Add(application);
}
Проблема, с которой я сталкиваюсь:
часть в if(application.Start())
вызывается, только если я открываю, скажем, exe-файлы или файл Excel (хотя PID, возвращаемый файлом Excel, не убивает программу Excel).
Когда я открываю mp3, mp4 или файл изображения, он не входит в if
заявление
При попытке получить идентификатор процесса, он возвращает следующую ошибку
System.InvalidOperationException: ни один процесс не связан с этим объектом.
2 ответа
Вы должны использовать ProcessStartInfo.UseShellExecute
чтобы иметь возможность "выполнять" документы (и позволить Windows найти программу, которая связана с данным файлом). Смотрите другие ответы там: ShellExecute против Process.Start.
Без этого флага можно запускать только exe-файлы.
В описании чего Process.Start
возвращает это говорит:
Значение true, если ресурс процесса запущен; false, если новый ресурс процесса не запущен (например, если существующий процесс используется повторно).
Так что, если вы запустите EXE, ожидается, что вызов Start
возвращает true (при условии, что EXE существует). Для случая, когда вы не даете ему EXE, становится немного непредсказуемо, что происходит. И основная причина в том, что оболочка обрабатывает ваши Start
, Если вы повторно запустите свои тесты с application.StartInfo.UseShellExecute = false;
вы получите совершенно разные результаты. Оказывается, вы можете запустить EXE (или COM-файлы) только тогда, когда UseShellExecute имеет значение false.
Ключевым моментом является то, что Start возвращает true, только если был запущен новый ресурс процесса. В моем тестировании я обнаружил, что если я запускаю файл.xlsx впервые, создается новый процесс Excel (фактически он становится дочерним процессом). Это делает это Start()
возвращает истину. Для каждого следующего файла.xlsx существующий процесс используется повторно, поэтому новый процесс не создается, следовательно, Start
возвращает ложь
То же самое касается и того, когда я запускаю файл.mp4. На моем устройстве это расширение по-прежнему связано с проигрывателем Windows Movie по умолчанию. Это создает только дочерний процесс в уже запущенной службе svchost. Это, вероятно, делает это false
возвращается
Если я использую расширение, связанное с моим плеером VLC Start
возвращает true для каждого нового файла, который я предлагаю, но, судя по всему, проигрыватель VLC передает свою работу уже запущенному экземпляру, а затем закрывает вновь запущенный процесс.
process.Start
возвращает правильный результат. То, что он возвращает, зависит от того, что запускается и как его зарегистрированный обработчик выбирает для работы. Исходя из этого, вы можете или не можете найти запуск нового процесса. Стоит отметить, что пользователи имеют контроль над тем, что связано с определенным расширением и, как таковой, что будет делать запуск файла с определенным расширением.
Вот как выглядит мое дерево процессов после нескольких экспериментов с несколькими типами файлов:
Для тех, кто получил процесс. Идентификатор, который все еще действителен.