WaitForSingleObject返回ERROR_INVALID_HANDLE

时间:2016-06-24 17:15:11

标签: c# winapi waitforsingleobject

我正在尝试确定一个进程是否仍处于活动状态(我检查的时刻,我知道它可以在我检查后立即关闭),通过调用WaitForSingleObject()调用句柄来自Process.MainWindowHandleIsIconic()一样正常,但它会返回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());
}

1 个答案:

答案 0 :(得分:5)

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

  

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

     
      
  • 更改通知
  •   
  • 控制台输入
  •   
  • 事件
  •   
  • 内存资源通知
  •   
  • 互斥
  •   
  • 过程
  •   
  • 信号量
  •   
  •   
  • 等待计时器
  •   

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

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

如果这是您开始使用Process类包装器的过程,则只需查询Process.HasExited属性即可。