2016-06-24 94 views
1

我試圖通過調用WaitForSingleObject()來確定一個進程是否還活着(此刻我確實檢查過,我知道它可以在我執行檢查後關閉),並且從Process.MainWindowHandle其工作原理只是IsIconic()不錯,但它返回WAIT_FAILEDGetLastError()一個ERROR_INVALID_HANDLEWaitForSingleObject返回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()); 
} 
+0

[從C#中調用WaitForSingleObject]可能重複(http://stackoverflow.com/questions/33718217/calling-waitforsingleobject-from-c-sharp) – MethodMan

+1

您不能等待窗口的句柄。請查看https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032.aspx上的文檔,瞭解可以等待的句柄類型。 – dxiv

+0

系統說您的句柄無效。你的句柄無效。 –

回答

5

你不能等待一個窗口句柄。您可以將窗口句柄傳遞給與窗口相關的函數,如IsIconic(),但它們不是內核對象,因此您無法等待它們。 The documentation給對象,你可以等待列表:

WaitForSingleObject函數可以等待以下對象:

  • 更改通知
  • 控制檯輸入
  • 事件
  • 內存資源通知
  • 互斥體
  • 過程
  • 信號燈
  • 螺紋
  • 可等待計時器

所以,如果你想等待一個過程,直到它結束,你可以等待進程的句柄,它是通過訪問Process.Handle財產。

但是你根本不需要P /調用Win32函數。 .NET Process包裝類具有WaitForExit()WaitForInputIdle()可用於等待進程的成員函數(請注意,兩者都具有超時值)。

如果這是一個開始使用Process類包裝器的過程,則可以簡單地詢問Process.HasExited屬性。

+2

如果你有一個'Process'對象,不管你是否是真正產生這個過程的人,你不應該使用'HasExited'?我不明白爲什麼它應該關心,如果調用者也是產卵者。 –

+0

感謝您的回答,我不想等到它退出,也沒有啓動過程。我想檢查一個確定的過程在某個特定時間是否仍然存在,然後再進行一些操作(它每隔x秒發生一次) – Jack

+0

@remy我寫這個的原因是我記得在某個地方讀到這個不起作用。據推測,Process類不會跟蹤這些信息,除非它啓動該過程。爲了證實我的記憶,我發現[這篇指導性文章](https://msdn.microsoft.com/en-us/library/y111seb2.aspx),在頂部說:*「注意:這個值是隻返回由進程組件啓動的進程。「*這可能不完全正確;你需要檢查參考源是絕對肯定的。 –

相關問題