如何判斷WINDOWS程式視窗是否無響應
SendMessageTimeout()
將指定的訊息傳送到一個或多個視窗。
此函式的原理是向一個待測試視窗傳送訊息,並期待返回值,如果沒有返回值則說明視窗無響應。
函式原型:
LRESULT SendMessageTimeoutA(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam,
UINT fuFlags,
UINT uTimeout,
PDWORD_PTR lpdwResult
);
引數1:要測試視窗的視窗控制代碼。
引數2:要傳送的訊息。
引數3:任何其他特定於訊息的資訊。
引數4:任何其他特定於訊息的資訊。
引數5:這個函式的行為。此引數可以是以下一個或多個值。
值:SMTO_ABORTIFHUNG 含義:如果接收執行緒似乎沒有響應或“掛起”,則函式返回而不等待超時時間過去。
值:SMTO_BLOCK 含義:阻止呼叫執行緒處理任何其他請求,直到函式返回。
值:SMTO_NORMAL 含義:在等待函式返回時,不會阻止呼叫執行緒處理其他請求。
值:SMTO_NOTIMEOUTIFNOTHUNG 含義:只要接收執行緒正在處理訊息,該功能就不會強制執行超時期限。
值:SMTO_ERRORONEXIT 含義:如果接收視窗被銷燬或其擁有的執行緒在處理訊息時死亡,則該函式應返回0。
引數6:超時時間的持續時間,以毫秒為單位。如果訊息是廣播訊息,則每個視窗可以使用完整的超時時段。例如,如果指定五秒超時時間並且有三個頂級視窗無法處理該訊息,則最多可能有15秒的延遲。
引數7:訊息處理的結果。此引數的值取決於指定的訊息。 一個DWORD型資料,用於接收返回值。
例:
DWORD vers;
LRESULT millio=SendMessageTimeout(peop,WM_NULL,0,0,SMTO_ABORTIFHUNG,3000,&vers);
經過幾次測試只有引數5填"SMTO_ERRORONEXIT"時測試視窗是否響應時結果正確,其他選項以及選項的組合測試結果與實際不符,有待於進一步使用。引數5是可以使用"SMTO_ABORTIFHUNG|SMTO_BLOCK"的形式來選擇多個值。