判斷窗體是否無響應(監控窗體)


一個窗體對應於一個線程,有時候模糊測試進行監控的時候,單獨對進程進行監控可能無法達到相應的效果,因此需要對線程監控。
一種方式 是對該進程的所有線程進行監控,通過判斷線程的狀態來判斷是否已經發生異常。但實際中用ProcessMoniter進行查看的時候,發現一個窗體停止響應,但是此線程依舊正常Running狀態,猜測可能是延時或者其他原因到時實時反饋並不是正常。
 
注:python Win32api和win32gui中都沒有相關的函數進行檢測判斷。
 
另一種方式是直接判斷窗體是否正常響應。
一般是使用三種方式(這里說的窗體未響應是指窗體無法移動,並且在任務管理器中窗體狀態是未響應),
 
1. 判斷窗體名,一般在窗體停止響應的時候,會在窗體名上有額外的字符串”(未響應)“,那么直接通過GetWindowText,獲取窗體的標題,因此來判斷窗體是否正常了。
局限性:這個方式並不穩定,在后面的測試過程中,發現有時候窗體發生未響應,但是窗體上標題並不顯示為未響應,或者有時會經過很長時間才出現”未響應“字符串。
 
2. 直接給窗體發消息,SendMessageTimeout函數,如果第一個返回值返回為0則表示無法窗體停止響應。
參考:
https://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k(SendMessageTimeout);k(DevLang-C);k(TargetOS-WINDOWS)&rd=true
但是在使用Python win32gui庫中的 SendMessageTimeout的時候。在窗體無響應的時候,仍然返回為非0值。因此這種方式也不太實用。
 
3. 使用MS提供的庫函數直接進行判斷。
這些函數會和Windows的版本有關,不同版本使用不同的函數。
Win 9x為IsHungThread(比較老的系統了);在Win NT/2000中為IsHungAppWindow,我在Win7中使用的是IsHungAppWindow,能夠正常檢測。
 
IsHungAppWindow:官方描述是
The return value is TRUE if the window stops responding; otherwise, it is FALSE. Ghost windows always return TRUE.
這個就是直接用於判斷window是否響應的函數。
通過測試,能夠正常檢測。
使用的是Python ctypes調用windows系統庫。
 
no_response = ctypes.windll.user32.IsHungAppWindow(hwnd)
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM