通过系统底层的函数,检测一个窗口(如记事本)是否响应。如果窗口在规定的时间内没有响应,代码会弹出提示,告诉用户“未响应”;如果窗口有响应,则会显示“正常响应”。

 

; 简易版【缺少时间设置,待验证】
; SendMessage, 0x0, 0, 0,, ahk_class Notepad
; if ErrorLevel
;     Msgbox 未响应1
;  else
;     Msgbox 正常响应1

; =================================================================
if DllCall("SendMessageTimeout", "UInt", WinExist("ahk_class Notepad"), "UInt", 0x0000, "Int", 0, "Int", 0, "UInt", 0x0002, "UInt", 100, "UInt *", 0)
    Msgbox 正常响应2
 else
    Msgbox 未响应2

; 函数版
检测程序是否未响应(WinTitle) {
  ; WinActivate, %WinTitle%
  WinGetTitle, 获取窗口标题, %WinTitle%
  if (InStr(获取窗口标题, "(未响应)")!=0)
    Return False
  if DllCall("SendMessageTimeout", "UInt", WinExist(WinTitle), "UInt", 0x0000, "Int", 0, "Int", 0, "UInt", 0x0002, "UInt", 100, "UInt *", 0)
    Return True  ; 正常响应
   else
    Return False  ; 未响应
}


; =================================================================
NR_temp := 0 ; init
TimeOut := 100 ; 在决定它没有响应之前要等待几毫秒 - 在100%的使用下,100毫秒似乎是可靠的。
; WM_NULL =0x0000
; SMTO_ABORTIFHUNG =0x0002
WinGet, wid, ID, ahk_class Notepad ; 检索要检查的窗口的ID
Responding := DllCall("SendMessageTimeout", "UInt", wid, "UInt", 0x0000, "Int", 0, "Int", 0, "UInt", 0x0002, "UInt", TimeOut, "UInt *", NR_temp)
if Responding = 1 ; 1= 正常响应, 0 = 未响应
    Msgbox 正常响应3
 else
    Msgbox 未响应3

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。