WaitForSingleObject返回ERROR_INVALID_HANDLE

Jac*_*ack 1 c# winapi waitforsingleobject

我正在尝试确定一个进程是否仍处于活动状态(此时我确实检查过,我知道它可以在我检查后立即关闭)通过调用WaitForSingleObject()一个句柄获取从中Process.MainWindowHandle工作得很好IsIconic()但它返回WAIT_FAILEDGetLastError()aERROR_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());
}
Run Code Online (Sandbox Code Playgroud)

Cod*_*ray 5

你不能等待窗户把手.您可以将窗口句柄传递给与窗口相关的函数,例如IsIconic(),但它们不是内核对象,因此您不能等待它们.该文档提供了可以等待的对象列表:

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

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

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

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

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

  • 如果你有一个`Process`对象,你不应该使用`HasExited`而不管你是否真的产生了这个过程?我不明白为什么它应该关心呼叫者是否也是产生者. (2认同)