广告合作
  • 今日头条

    今日头条

  • 百度一下

    百度一下,你就知道

  • 新浪网

    新浪网 - 提供新闻线索,重大新闻爆料

  • 搜狐

    搜狐

  • 豆瓣

    豆瓣

  • 百度贴吧

    百度贴吧——全球领先的中文社区

  • 首页 尚未审核订阅工具 订阅

    按键精灵开发教程:QUI界面不卡死

    来源:网络收集  点击:  时间:2024-05-13
    【导读】:
    Qui界面加载之后卡死?点击控件之后卡死?为什么会出现这种情况?该如何解决?且听小编细细道来~工具/原料more按键精灵2014方法/步骤1/11分步阅读

    原因

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

    QUI界面事件:

    2/11

    窗口事件以及控件事件统称为界面事件。界面事件?按键精灵是怎么知道我们点击了哪个控件,鼠标移动到了界面的哪里了呢?其实,我们看似平常的一个操作,例如:移动鼠标到窗口界面上点击输入框。这样的一个操作,其实是被分解成了几百条消息反馈给按键精灵软件,告诉它鼠标现在在哪里,做了什么,点击了控件,然后控件要响应什么操作等等。而这些消息,按键精灵软件会逐条处理,处理完这一条才会继续处理下一条。所以,当它在处理循环事件会延时事件时,没有处理完之前都不处理其它信息。

    3/11

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

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

    4/11

    代码:

    EventForm1.Button1.Click

    BeginThread循环//启动线程

    EndEvent

    Sub循环

    Fori=1To100

    Delay200

    Form1.InputBox1.Text=i

    Next

    EndSub

    5/11

    2、定时器

    6/11

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

    代码:

    EventForm1.Button1.Click

    Form1.Timer1.Enabled=True

    EndEvent

    EventForm1.Timer1.Timer

    i=i+1

    Ifi=100thenForm1.Timer1.Enabled=False

    Form1.InputBox1.Text=i

    EndEvent

    7/11

    1、API函数

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

    8/11

    代码:

    DeclareFunctionPeekMessageALibuser32.dllAliasPeekMessageA(ByVal消息格式AsAny,ByVal窗口句柄AsLong,ByVal消息最小过滤值AsLong,ByVal消息最大过滤值AsLong,ByVal删除消息AsLong)AsLong

    DeclareFunctionLocalAllocLibkernel32AliasLocalAlloc(ByValwOemCharAsLong,ByValwOmCharAsLong)AsLong

    DeclareFunctionLocalFreeLibkernel32AliasLocalAlloc(ByValhMemAsLong)AsLong

    DeclareFunctionTranslateMessageLibuser32.dllAliasTranslateMessage(ByVal消息结构AsAny)AsLong

    DeclareFunctionDispatchMessageALibuser32.dllAliasDispatchMessageA(ByVal消息结构AsAny)AsLong

    EventForm1.Button1.Click

    Fori=1to100

    Form1.InputBox1.Text=i

    call处理事件

    Next

    EndEvent

    Sub处理事件()

    WM=LocalAlloc(0,28)//分配一块存储空间用于存放消息

    IfPeekMessageA(WM,0,0,0,1)0Then//获取当前程序的消息存放在消息结构里,然后将消息删除,忽略不处理

    TranslateMessageWM//将空消息转换成程序可识别格式(虚拟键消息转换为字符消息)

    DispatchMessageAWM//将转完格式的空消息反馈给程序

    EndIf

    LocalFreeWM//释放存储空间

    EndSub

    9/11

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

    API函数

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

    10/11

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

    代码:

    DeclareFunctionPeekMessageALibuser32.dllAliasPeekMessageA(ByVal消息格式AsLong,ByVal窗口句柄AsLong,ByVal消息最小过滤值AsLong,ByVal消息最大过滤值AsLong,ByVal删除消息AsLong)AsLong

    DeclareFunctionLocalAllocLibkernel32AliasLocalAlloc(ByValwOemCharAsLong,ByValwOmCharAsLong)AsLong

    DeclareFunctionLocalFreeLibkernel32AliasLocalAlloc(ByValhMemAsLong)AsLong

    DeclareFunctionTranslateMessageLibuser32.dllAliasTranslateMessage(ByVal消息结构AsLong)AsLong

    DeclareFunctionDispatchMessageALibuser32.dllAliasDispatchMessageA(ByVal消息结构AsLong)AsLong

    DeclareFunctionGetTickCountLibkernel32AliasGetTickCount()AsLong

    EventForm1.Button1.Click

    Fori=0To10

    Form1.InputBox1.Text=i

    call超级延时(200)

    Next

    EndEvent

    Sub超级延时(毫秒)

    Dims

    s=GetTickCount()

    Wm=LocalAlloc(0,28)

    While(GetTickCount()-s毫秒)

    IfPeekMessageA(Wm,0,0,0,1)0Then//得到消息

    TranslateMessageWm

    DispatchMessageAWm

    EndIf

    Wend

    LocalFreeWm

    EndSub

    11/11

    注意:

    使用API函数忽略消息有个弊端,那就是当我们忽略消息的过程中,如果我们关闭了窗口,那只是假关闭。窗口的关闭是操作系统处理响应的,而关闭窗口之后要触发的一些操作,例如销毁进程、释放内存空间等等,都是程序本身在执行。但是程序被关闭时的状态是忽略处理消息的状态,关闭窗口要触发的操作被忽略掉了。所以看上去窗口被关闭了,实际上窗口还在运行中。

    教程
    本文关键词:

    版权声明:

    1、本文系转载,版权归原作者所有,旨在传递信息,不代表看本站的观点和立场。

    2、本站仅提供信息发布平台,不承担相关法律责任。

    3、若侵犯您的版权或隐私,请联系本站管理员删除。

    4、文章链接:http://www.1haoku.cn/art_752909.html

    相关资讯

    ©2019-2020 http://www.1haoku.cn/ 国ICP备20009186号05-07 18:44:59  耗时:0.037
    0.037s