Как запустить процесс и установить его главное окно как дочернее окно моего приложения

Я запускаю новый процесс из моего приложения на C#.

После создания процесса я установил его главное окно как дочернее окно моего приложения, используя ManagementEventWatcher и SetParent.

Проблема в том, что когда я пишу в своем запросе WITHIN 2, все работает нормально, за исключением того, что я жду долго. Когда я пишу WITHIN 1, MainWindowHandle запущенного процесса еще не создан, когда сработало событие EventArrived.

Есть ли хороший способ ожидания создания дескриптора, кроме использования таймера?

1 ответ

Решение

Согласно документации MSDN для Process.MainWindowHandle Вы можете использовать Process.WaitForInputIdle() метод для того, чтобы "позволить процессу завершить запуск, гарантируя, что дескриптор главного окна был создан".

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

В любом случае, продолжайте и ждите:

yourProcess.WaitForInputIdle();
//Do your stuff with the MainWindowHandle.

Другой вариант будет запускать ваш код в потоке и цикл до MainWindowHandle не ноль. Чтобы не попасть в бесконечный цикл, вы можете добавить какое-то время ожидания.

int timeout = 10000; //10 seconds.
while (yourProcess.MainWindowHandle == IntPtr.Zero && timeout > 0)
{
    yourProcess.Refresh();
    System.Threading.Thread.Sleep(250); //Wait 0.25 seconds.
    timeout -= 250;
}

if (yourProcess.MainWindowHandle == IntPtr.Zero)
{
    //Timed out, process still has no window.
    return; //Do not continue execution.
}

//The rest of your code here.
Другие вопросы по тегам