1

我试图确定一个进程是否仍然存在(在我检查的那一刻,我知道它可以在我检查后立即关闭)通过调用WaitForSingleObject()一个句柄 get 从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());
}
4

1 回答 1

5

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

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

  • 变更通知
  • 控制台输入
  • 事件
  • 内存资源通知
  • 互斥体
  • 过程
  • 信号
  • 线
  • 等待定时器

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

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

如果这是您开始使用Process类包装器的过程,您可以简单地询问该Process.HasExited属性。

于 2016-06-24T17:23:00.583 回答