c# - WaitForSingleObject 返回 ERROR_INVALID_HANDLE

标签 c# winapi waitforsingleobject

我试图通过调用 WaitForSingleObject() 来确定进程是否仍然存在(目前我确实检查过,我知道它可以在检查后立即关闭)带有 handle ,来自Process.MainWindowHandleIsIconic() 配合得很好但它返回 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());
}

最佳答案

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

The WaitForSingleObject function can wait for the following objects:

  • Change notification
  • Console input
  • Event
  • Memory resource notification
  • Mutex
  • Process
  • Semaphore
  • Thread
  • Waitable timer

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

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

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

关于c# - WaitForSingleObject 返回 ERROR_INVALID_HANDLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38018838/

相关文章:

multithreading - 使用 WaitForSingleObject() 等待线程完成

c# - 在Unity中发送POST请求

c# - 使用新关键字 'await' 的异步调用

无法在 C 中锁定互斥体

c++ - WaitForSingleObject 不等待进程结束

c++ - 在 Windows 上实现堆栈跟踪

c# - 在C#中创建类时可以在构造函数中创建对象吗

c# - 当 Ninject 被用作依赖解析器时,如何在 asp.net mvc3 App 中处理 DbContext(或对象)

c - 纯 C : Dialogue default handling of Ctrl+C messages

c++ - ShowCaret 和 SetCaretPos 因 ERROR_ACCESS_DENIED 而失败