Как запустить процесс и установить его главное окно как дочернее окно моего приложения
Я запускаю новый процесс из моего приложения на 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.