1. 程式人生 > >如何判斷WINDOWS程式視窗是否無響應

如何判斷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"的形式來選擇多個值。