Запуск внешнего процесса и установка значения после его завершения - PullRequest
0 голосов
/ 12 февраля 2011

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

Я могу отключить верхнюю настройку нашего главного окна и запустить мое приложение, но мне нужно иметь возможность установить для нашего MainWindow.Topmost значение true после выхода из внешнего приложения.

Было предложено добавить обработчик событий при запуске процесса, который может сбрасывать верхний уровень после завершения процесса. Обработчики событий являются новыми для меня, поэтому я не уверен, как это сделать. Может ли кто-нибудь провести меня через это?

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

            Application.Current.MainWindow.Topmost = false;
            System.Diagnostics.Process.Start(@"C:\path\to\app.exe");

Большое спасибо.

(И я буду читать о обработчиках событий и делегатах на этих выходных!)

Ответы [ 2 ]

2 голосов
/ 12 февраля 2011

Создайте процесс, установите для параметра EnableRaisingEvents значение true и обработайте событие Exited:

Process p = new Process();
p.StartInfo.FileName = pathToApp;
p.EnableRaisingEvents = true;
p.Exited += OnCalibrationProcessExited;  // hooks up your handler to the Process
p.Start();

// Now .NET will call this method when the process exits
private void OnCalibrationProcessExited(object sender, EventArgs e)
{
  // set Topmost
}

Из потока комментариев событие Exited возникает в рабочем потоке, поэтому вам нужно будет использоватьDispatcher.BeginInvoke для переключения на поток пользовательского интерфейса для установки Topmost:

private void OnCalibrationProcessExited(object sender, EventArgs e)
{
  Action action = () => { /* set Topmost */ };
  Dispatcher.BeginInvoke(DispatcherPriority.Normal, action);
}

(предполагается, что код находится в вашем классе Window. Если нет, вам нужно будет написать что-то вроде Application.Current.MainWindow.Dispatcher.BeginInvoke(...).)

Примечание. Я отделил создание и настройку объекта Process от его запуска.Хотя это более многословно, необходимо убедиться, что все средства обработки событий находятся на месте до процесса, иначе процесс может завершиться до того, как вы поместите обработчик на место (маловероятно, но теоретически возможно)!) и ваш обработчик никогда не будет вызван.

1 голос
/ 12 февраля 2011

Вы можете дождаться завершения процесса через Process.WaitForExit :

Application.Current.MainWindow.Topmost = false;
var process = System.Diagnostics.Process.Start(@"C:\path\to\app.exe");
process.WaitForExit();
Application.Current.MainWindow.Topmost = true;

Если вы хотите указать значение тайм-аута, чтобы процесс не ожидал вечно, это такжевозможный.Например, если вы хотите подождать максимум 2 минуты, вы можете сделать:

process.WaitForExit(2 * 60000); // 60000ms/minute
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...