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