WaitForSingleObject возвращает ERROR_INVALID_HANDLE
Я пытаюсь определить, жив ли еще процесс (в тот момент, когда я проверял, я знаю, что его можно закрыть сразу после того, как я выполню проверку), вызывая WaitForSingleObject()
с ручкой достать из Process.MainWindowHandle
который прекрасно работает с IsIconic()
но это вернуть WAIT_FAILED
а также GetLastError()
ERROR_INVALID_HANDLE
UInt32 r = WaitForSingleObject(handle, 0);
if(r == WAIT_OBJECT_0)
{
MessageBox.Show("still running!");
}
if(r == WAIT_FAILED)
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
1 ответ
Вы не можете ждать на ручке окна. Вы можете передавать дескрипторы окна в функции, связанные с окном, например, IsIconic()
, но они не являются объектами ядра, поэтому вы не можете ждать их. В документации приведен список объектов, которые вы можете ждать:
Функция WaitForSingleObject может ожидать следующие объекты:
- Уведомление об изменении
- Консольный ввод
- Событие
- Уведомление о ресурсе памяти
- Mutex
- Процесс
- семафор
- Нить
- Таймер ожидания
Итак, если вы хотите дождаться завершения процесса, вы можете дождаться дескриптора процесса, который доступен через Process.Handle
имущество.
Но на самом деле вам вообще не нужно P/ вызывать функцию Win32. Сеть Process
класс оболочки имеет WaitForExit()
а также WaitForInputIdle()
функции-члены, которые можно использовать для ожидания процесса (обратите внимание, что обе имеют перегрузки, принимающие значение времени ожидания).
Если это процесс, который вы начали использовать Process
Обертка класса, вы можете просто опросить Process.HasExited
имущество.