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 имущество.

Другие вопросы по тегам