ui分离的进程 如何查找窗口句柄_按键精灵如何知道窗口是否无响应或卡屏呢

金猪脚本(原飞猪脚本)以按键精灵教学为主,涉及UiBot,Python,Lua等脚本编程语言,教学包括全自动办公脚本,游戏辅助脚本,引流脚本,网页脚本,安卓脚本,IOS脚本,注册脚本,点赞脚本,阅读脚本以及网赚脚本等各个领域。想制作脚本和学习按键精灵的朋友可以添加按键精灵学习交流群:554127455 学习路上不再孤单,金猪脚本伴你一同成长.

2e059cbfa113a4b0d888113f4b869871.png

开开心心做设计,敲代码

2a1bc3e0741bcfcaee886dd1fa2bc41a.gif

顺顺利利调试运行,美滋滋的上万行代码,遛遛的通过了语法检查

1b9af7291162ac4743698d7323cefc68.gif

咦,突然不动了......

95d88210c50279eb8d821319da8cf30a.gif

卡……卡屏了么。。。窗口无响应。。。。程序停止运行。。。浏览器崩溃。。

cd4d96787a31459375f75d85e9596bfd.gif

TMD在逗我。。

窗口无响应,卡屏,浏览器崩溃……一直是脚本作者们头疼的问题。大多数人在遇到无响应等问题的时候,如果是重要的数据只能选择等待,忍无可忍时强制关闭程序。可是,下一次遇到无响应问题该怎么办呢?如何一劳永逸解决这个头疼点呢?

近日小编收到陈征用同学推荐的帖子,一大神分享了“关于窗口无响应、卡屏状态的判断/判定”,仔细阅读之下发现有妙用,故此来分享给大家,希望能给大家带来一些帮助,妈妈再也不用担心我卡屏、窗口无响应问题啦

a2e41dfb92ff0ca685a4d7948c9d128c.gif

知识拓展

疑问:为什么会出现卡屏、窗口无响应等情况呢?

电脑卡屏、窗口无响应的原因很多,针对脚本作者,可能有如下原因造成:

1.硬件配置问题

如:硬盘坏道、cpu过热等等(扫描硬盘、检查CPU风扇)

还有可能是驱动不兼容问题(扫描显卡或其他驱动,判断是否是最适应的)

2.内存消耗问题

程序运行时,消耗的内存太大,导致窗口无响应、卡屏等情况发生。(更换内存,加大内存)

3.电脑机箱长期未清理

电脑机箱里面内存条进灰尘,拆开机箱,拆下内存条,清洁下内存金手指(用橡皮擦擦拭,或者用浸泡过酒精,拧干的湿布),重新装回去,就可能可以了。


解决方案:

'方案一:API

  1. Private Declare Function IsHungAppWindow Lib "user32.dll" ( ByVal hWnd As Long) As Long
  2. Hwnd = Plugin.Window.Find(0, "无")
  3. TracePrint Hwnd
  4. Do
  5. If IsHungAppWindow(Hwnd)=0 Then
  6. i=0'窗口正常,次数归零
  7. TracePrint "窗口正常"
  8. Else
  9. i=i+1
  10. If i = 60 Then'如果窗口未响应60次,就弹出窗口
  11. MsgBox "窗口未响应"
  12. End If
  13. End If
  14. Delay 1000
  15. Loop

复制代码

思路解析:以上方法通过调用系统win32的窗口通用控制类API:IsHungAppWindow,用来检测窗口是否为未响应。

通过要判断的窗口的句柄,进行IsHungAppWindow检测。若检测到窗口响应,则说明窗口正常响应,返回消息“窗口正常”。若检测到窗口无响应,则返回消息“窗口未响应”。

'方案二:发消息

  1. '给程序发消息,得到回应则说明有响应
  2. Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  3. Declare Function SendMessageTimeout Lib "user32" Alias "SendMessageTimeoutA" (ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long, ByVal fuFlags As Long, ByVal uTimeout As Long, lpdwResult As Long) As Long
  4. Cjb = FindWindow(vbNullString, 要检测进程窗体的标题名)
  5. Qqq = SendMessageTimeout(Cjb, WM_NULL, 0, 0, SMTO_ABORTIFHUNG And SMTO_BLOCK, 3000, lngResult)
  6. If Qqq = 0 Then
  7. TracePrint "进程不正常"
  8. else
  9. TracePrint "进程正常"
  10. end if

复制代码

cf9213c6627d455d4dbcfa7938552a6d.png

注:Cjb = FindWindow(vbNullString, 要检测进程窗体的标题名),这里需要用双引号输入要检测进程窗体的标题名,例如"按键精灵"。

思路解析:以上方法调用了2个系统API。

调用系统API:findwindow,该函数获得一个顶层窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数不查找子窗口。

调用系统API:SendMessageTimeout,该函数将指定的消息发送到一个或多个窗口。

通过给进程窗体发消息来判断窗口是否响应是否正常。若能检测到进程窗体的标题,则返回“进程正常”,若检测不到,则返回“进程不正常”。

注:Qqq = SendMessageTimeout(Cjb, WM_NULL, 0, 0, SMTO_ABORTIFHUNG And SMTO_BLOCK, 3000, lngResult)这里的3000是延迟时间,程序运行到这一段的时候,软件会有3s的延迟时间。这个参数的设置,大大们可以根据自己电脑的配置来进行设置哦。要是配置ok,反应迅速,500的延迟也就够了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值