c # Process.Start () не возвращает правильный ответ - PullRequest
0 голосов
/ 01 сентября 2018

Я разрабатываю программу, где пользователь может запустить любое приложение из программы. Программа сохранит идентификатор процесса запущенного приложения, поэтому она может завершить его, когда пользователь захочет.

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 ]

0 голосов
/ 01 сентября 2018

В описании что 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 возвращает false.

То же самое касается и того, когда я запускаю файл .mp4. На моем устройстве это расширение по-прежнему связано с проигрывателем Windows Movie по умолчанию. Это создает только дочерний процесс в уже запущенной службе svchost. Это, вероятно, означает, что false возвращается.

Если я использую расширение, связанное с моим проигрывателем VLC, Start возвращает значение true для каждого нового файла, который я предлагаю, но, судя по всему, проигрыватель VLC передает свою работу уже запущенному экземпляру, а затем закрывает недавно начатый процесс.

process.Start возвращает правильный результат. То, что он возвращает, зависит от того, что запускается и как его зарегистрированный обработчик выбирает для работы. Исходя из этого, вы можете или не можете найти запуск нового процесса. Стоит отметить, что пользователи имеют контроль над тем, что связано с определенным расширением, и, таким образом, что будет делать запуск файла с определенным расширением.

Вот как выглядит мое дерево процессов после нескольких экспериментов с несколькими типами файлов:

enter image description here

Для тех, кто получил процесс. Идентификатор все еще действителен.

0 голосов
/ 01 сентября 2018

Вы должны использовать ProcessStartInfo.UseShellExecute, чтобы иметь возможность «выполнять» документы (и позволить Windows найти программу, связанную с данным файлом). Смотрите другие ответы там: ShellExecute vs. Process.Start .

Без этого флага можно запускать только исполняемые файлы.

...