Как запустить процесс и сделать его главное окно модальным по отношению к окну запуска процесса? - PullRequest
3 голосов
/ 07 июля 2010

У меня есть программа C # WinForms, которая запускает другой процесс.Затем программа ожидает завершения процесса.

В настоящее время я использую Process.WaitForExit (), но это означает, что, пока моя программа ожидает завершения процесса, она не перерисовывается и «выглядит» так, как будтоне отвечает.

Есть ли способ для Окна Процесса, что моя программа запускается, быть модальной для моей основной формы (т.е. вы не можете переключиться обратно на мою программу и окно перерисовывается)?

В основном я хочу сделать что-то вроде Form.ShowDialog (), за исключением использования окна процесса в качестве формы, отображаемой в виде диалога.

Ответы [ 8 ]

1 голос
/ 07 июля 2010

Вы не можете запретить пользователю переключаться обратно, потому что вы создали отдельный процесс. Что касается операционной системы, то вы бы запустили вторую, например, с помощью значка на рабочем столе (*).

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

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

1 голос
/ 07 июля 2010

Почему бы вам не начать свой процесс в отдельном потоке? Таким образом, только ваша тема будет ждать. Таким образом, ваша форма будет по-прежнему отвечать.

0 голосов
/ 27 мая 2019

Еще один способ, который немного нестандартен, но работает.Определите переменную ProcessActive.На каждом из элементов управления, видимых в приложении, проверьте переменную и, если она установлена, не обрабатывайте событие элементов управления.Перед запуском процесса установите для переменной ProcessActive значение True и запустите процесс с событиями.Определите событие Exited для процесса, чтобы оно установило ProcessActive в False.Они могут переключиться обратно на запуск приложения, и все выглядит хорошо.Он просто ничего не сделает, пока процесс не завершится.Возможно, вы захотите установить курсор на песочные часы, чтобы они знали, что приложение занято.

0 голосов
/ 11 марта 2015

Насколько я знаю, это невозможно.Вы можете использовать SetParent (неуправляемый), чтобы установить отношения ребенок / родитель, но это настолько далеко, насколько вы можете зайти.Примечание. Я использую программу на основе Perl, и процедура SetParent () не работает так, как было объявлено.

0 голосов
/ 08 июля 2010
  1. Используйте событие process.Exited, чтобы узнать, когда закроется приложение.
  2. Подключите событие Активировано (думаю, это правильное имя) в вашей форме.Используйте его для фокусировки другого приложения.
0 голосов
/ 07 июля 2010

Вы должны обязательно создать новый поток и из этого потока запустить приложение, которое вы пытаетесь запустить.Это сделает ваше приложение отзывчивым, даже когда другое приложение работает

0 голосов
/ 07 июля 2010

Вы можете создать другую форму, которую вы делаете модальной.При загрузке этой формы вы вызываете Visible = false;, затем запускаете поток, который запускает ваш процесс и ожидает его завершения через поток.

Затем выполните BeginInvoke(new MethodInvoker(delegate { Close(); } )); из потока после ожидания завершения.

0 голосов
/ 07 июля 2010

Создать форму, показать ее модально.затем используйте BackgroundWorker для запуска процесса и обработки события RunWorkerCompleted для закрытия формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...