• 按键公众号 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:2021-12-03

按键精灵安卓版
立即下载

软件版本:3.7.2
软件大小:46.2M
更新时间:2023-05-10

按键精灵iOS版
立即下载

软件版本:1.8.0
软件大小:29.2M
更新时间:2023-03-21

按键手机助手
立即下载

软件版本:3.8.0
软件大小:262M
更新时间:2023-05-30

快捷导航

登录 后使用快捷导航
没有帐号? 注册

返回列表 12345678» / 10
发新话题 回复该主题

[技术交流] 【院刊】-【201503期】QUI界面不再卡死 [复制链接]

1#

QUI界面不再卡死

本文按键学院提供技术支持


按键学院交流群(1群已满):376122403

零基础学按键精灵群(2群):372671254



Qui界面加载之后卡死?点击控件之后卡死?
为什么会出现这种情况?该如何解决?
且听小编细细道来~





原因
QUI界面事件如果添加循环命令,或者延时命令。添加之后,我们再去点击QUI界面,就会出现卡死的现象。

QUI界面事件:

您所在的用户组无法下载或查看附件






窗口事件以及控件事件统称为界面事件



界面事件?
按键精灵是怎么知道我们点击了哪个控件,鼠标移动到了界面的哪里了呢?
其实,我们看似平常的一个操作,

例如:移动鼠标到窗口界面上点击输入框。
这样的一个操作,其实是被分解成了几百条消息反馈给按键精灵软件,告诉它鼠标现在在哪里,做了什么,点击了控件,然后控件要响应什么操作等等。

而这些消息,按键精灵软件会逐条处理,处理完这一条才会继续处理下一条。


所以,当它在处理循环事件会延时事件时,没有处理完之前都不处理其它信息。





使用循环命令导致界面卡死的解决方法

1、多线程

界面上有两个控件,输入框1([backcolor=rgb(247, 247, 247)]InputBox1按钮1([backcolor=rgb(247, 247, 247)]Button1
当按下按钮1(
[backcolor=rgb(247, 247, 247)]Button1时,
启动线程,将延时命令循环命令放在线程里执行。循环一百次给输入框赋值。

您所在的用户组无法下载或查看附件


代码:
  1. Event Form1.Button1.Click
  2. BeginThread 循环 //启动线程
  3. End Event
  4. Sub 循环
  5. For i = 1 To 100
  6. Delay 200
  7. Form1.InputBox1.Text = "" & i
  8. Next
  9. End Sub
复制代码
2、定时器

您所在的用户组无法下载或查看附件


定时器有效设置为
时间间隔设置为200毫秒(执行一次循环需要的时间)

当按下按钮1([backcolor=rgb(247, 247, 247)]Button1时,将定时器有效设置为( Form1.Timer1.Enabled = True)
定时器每隔200毫秒会执行一次 Timer 事件
我们在 Timer事件中,定义一个变量i,每执行一次 Timer时间i的值叠加1,直到i的值等于我们设置循环次数,则将定时器的有效设置为否。


代码:
  1. Event Form1.Button1.Click
  2. Form1.Timer1.Enabled = True
  3. End Event
  4. Event Form1.Timer1.Timer
  5. i = i + 1
  6. If i= 100 then Form1.Timer1.Enabled=False
  7. Form1.InputBox1.Text = "" & i
  8. End Event
复制代码
3、API函数


我们已经知道了,界面卡住,是因为在处理循环命令时,产生了其它的消息导致的。
那么我们可以这样做,当在执行循环命令时,界面上的其它所有消息都忽略掉,不反馈给按键精灵软件
要用到四个Api函数:LocalAlloc、PeekMessageA、TranslateMessage、 DispatchMessageA、LocalFree

代码:
  1. Declare Function PeekMessageA Lib "user32.dll" Alias "PeekMessageA"(ByVal 消息格式 As Any,ByVal 窗口句柄 As Long,ByVal 消息最小过滤值 As Long,ByVal 消息最大过滤值 As Long,ByVal 删除消息 As Long) As Long
  2. Declare Function LocalAlloc Lib "kernel32" Alias "LocalAlloc" (ByVal wOemChar As Long,ByVal wOmChar As Long) As Long
  3. Declare Function LocalFree Lib "kernel32" Alias "LocalAlloc" (ByVal hMem As Long) As Long
  4. Declare Function TranslateMessage Lib "user32.dll" Alias "TranslateMessage"(ByVal 消息结构 As Any) As Long
  5. Declare Function DispatchMessageA Lib "user32.dll" Alias "DispatchMessageA"(ByVal 消息结构 As Any) As Long

  6. Event Form1.Button1.Click
  7. For i=1 to 100
  8. Form1.InputBox1.Text = "" & i
  9. call 处理事件
  10. Next
  11. End Event

  12. Sub 处理事件()
  13. WM=LocalAlloc (0,28) //分配一块存储空间用于存放消息
  14. If PeekMessageA(WM, 0, 0, 0, 1)




    使用延时命令导致界面卡死的解决方法



    API函数

    当我们的延时命令不是放在多线程里,也不是靠定时器来处理,一定要放在QUI事件中时,该怎么办呢?
    我们用上面说到的Api函数忽略消息的方法外加一个API函数:GetTickCount
    来模拟一个在QUI界面事件中可执行的延时命令。

    函数:
    GetTickCountGetTickCount返回从操作系统启动所经过的毫秒数

    步骤:
    我们先获取一次操作系统启动经过的毫秒数,放到变量s
    然后循环再次获取操作系统启动经过的毫秒数,如果小于我们设定的延时,就继续忽略消息,如果达到延时数则继续下一条循环。


    代码: 0 Then //获取当前程序的消息存放在 "消息结构"里,然后将消息删除,忽略不处理
  15. TranslateMessage WM //将空消息转换成程序可识别格式(虚拟键消息转换为字符消息)
  16. DispatchMessageA WM //将转完格式的空消息反馈给程序
  17. End If
  18. LocalFree WM //释放存储空间
  19. End Sub
复制代码
注意:
使用API函数忽略消息有个弊端,那就是当我们忽略消息的过程中,如果我们关闭了窗口,那只是假关闭。
窗口的关闭是操作系统处理响应的,而关闭窗口之后要触发的一些操作,例如销毁进程、释放内存空间等等,都是程序本身在执行。但是程序被关闭时的状态是忽略处理消息的状态,关闭窗口要触发的操作被忽略掉了。
所以看上去窗口被关闭了,实际上窗口还在运行中。




帖子中API函数方法由[backcolor=rgb(229, 237, 242)]风__琪仙 提供
特别感谢 [backcolor=rgb(229, 237, 242)]风__琪仙 童鞋~~










本文按键学院提供技术支持

【招生】主流回合制常见功能网络辅助教学——你懂得!




    已有4评分我要评分查看所有评分

    本主题由 超级版主 瑞祥幽冥狼 于 2023/10/5 18:06:53 执行 审核帖子 操作
    按键学院免费交流群:376122403

    按键学院招生计划
    按键学院系统教程
    2#

    好好学习天天向上

    3#

    学习了

    4#

    大家好

    5#

    22222222

    6#

    kankan

    7#

    感谢,学习一下~~~~~~~~~~

    8#

    老是卡死

    9#

    我个就

    10#

    真格的

    11#

    水电费多福多寿

    12#

    学习中

    13#

    QUI界面不再卡死

    官方实名认证作者 QQ:185220901
    承接 游戏,办公...各类脚本制作
    14#

    阿斯大三大四的大

    15#

    66666666666666

    16#

    444444444444444

    17#

    谢谢分享,学习学习

    18#

    RE:【院刊】-【201503期】QUI界面不再卡死修改

    19#

    了解一下

    20#

    网沙特等国需

    发新话题 回复该主题