WaitForSingleObject return ERROR_INVALID_HANDLE

本文关键字:INVALID HANDLE ERROR return WaitForSingleObject | 更新日期: 2023-09-27 17:49:16

我试图确定一个进程是否仍然活着(在我检查的那一刻,我知道它可以在我检查后立即关闭)通过调用WaitForSingleObject(),从Process.MainWindowHandle获得一个处理柄,IsIconic()工作正常,但它返回WAIT_FAILEDGetLastError()一个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());
}

WaitForSingleObject return ERROR_INVALID_HANDLE

不能等待窗口句柄。您可以将窗口句柄传递给与窗口相关的函数,如IsIconic(),但它们不是内核对象,因此您不能等待它们。文档给出了一个可以等待的对象列表:

WaitForSingleObject函数可以等待以下对象:

  • 更改通知
  • 控制台输入
  • 内存资源通知
  • 互斥
  • 信号量
  • 线程
  • 可等待定时

所以,如果你想等待一个进程直到它结束,你可以等待进程的句柄,这个句柄可以通过Process.Handle属性访问。

但是实际上你根本不需要p/Invoke Win32函数。. net Process包装器类具有WaitForExit()WaitForInputIdle()成员函数,可用于等待进程(注意,两者都具有接受超时值的重载)。

如果这是一个使用Process类包装器启动的进程,您可以简单地询问Process.HasExited属性。