找回密码
 加入
搜索
查看: 4142|回复: 9

[AU3基础] 自定义热键的问题!可能是BUG?

  [复制链接]
发表于 2010-10-12 22:30:24 | 显示全部楼层 |阅读模式
本帖最后由 manlty 于 2010-10-12 23:11 编辑

用HOTKEYSET定义了热键,比如CTRL+W
现在问题来了,如果热键触发的函数里用到blockinput(1)等鼠标键盘函数,函数执行完了后,CTRL键被锁死,也就是需要手动再按一下CTRL键才能复位,要不这个键总是按下状态,为什么会有这种问题呢?如何解决?
 楼主| 发表于 2010-10-13 10:41:37 | 显示全部楼层
高手能解决吗
发表于 2010-10-13 10:49:34 | 显示全部楼层
适当位置加 Send('^')
 楼主| 发表于 2010-10-13 19:55:09 | 显示全部楼层
没用,不信大伙试试
 楼主| 发表于 2010-10-13 20:25:15 | 显示全部楼层
真是奇怪,不知道出这个问题的原理是什么
在函数最后send("^")也没用
发表于 2010-10-13 21:54:26 | 显示全部楼层
那就试试 Send('{LCTRL up}')
 楼主| 发表于 2010-10-13 23:10:59 | 显示全部楼层
都试过了,不行
会不会是按热键的时候,在脚本运行到blockinput(1)(0)之间松开了按键,由于屏蔽掉键盘动作,松开无效,导致CTRL键被锁定为down?但是奇怪,为什么代码最后send("^")确不能复位?难道send和手按不是一回事?
发表于 2020-9-4 05:27:25 | 显示全部楼层
目前发现是blockinput函数的问题,禁止输入前ctrl功能键是按下,启用输入时ctrl释放,那么ctrl就会被锁定为按下状态。
那么解决的办法就只有在ctrl按下时候禁止执行blockinput(1).然后等待ctrl物理按键释放。
列子
#include <WinAPI.au3>
HotKeySet("^x", "HotKey")

While 1
        Sleep(500)
        If BitAND(_WinAPI_GetAsyncKeyState(0xA2), 0x8000) <> 0 Then
                ConsoleWrite("CTRL:down" & @CRLF)
        EndIf
WEnd

Func HotKey()
        HotKeySet("^x")
        Do
                Sleep(5)
        Until BitAND(_WinAPI_GetAsyncKeyState(0xA2), 0x8000) = 0
        BlockInput(1)
        ConsoleWrite("HotKey:ctrl+x" & @CRLF)
        Sleep(250)
        BlockInput(0)
        HotKeySet("^x", "HotKey")
EndFunc   ;==>HotKey
发表于 2020-9-4 05:42:03 | 显示全部楼层
本帖最后由 gyp2000 于 2020-9-4 05:57 编辑

不过后来又找到一个可以合成按键的函数 _WinAPI_Keybd_Event。
这个函数可以模拟物理键盘的释放动作。
BlockInput(1)
_WinAPI_Keybd_Event(0xA2, $KEYEVENTF_KEYUP)


_WinAPI_Keybd_Event(0xA2, $KEYEVENTF_KEYUP)
BlockInput(1)


BlockInput(0)
_WinAPI_Keybd_Event(0xA2, $KEYEVENTF_KEYUP)

都可以达到释放按键的效果

例子:
#include <WinAPISys.au3>
#include <WinAPI.au3>
HotKeySet("^x", "HotKey")

While 1
        Sleep(500)
        If BitAND(_WinAPI_GetAsyncKeyState(0xA2), 0x8000) <> 0 Then
                ConsoleWrite("CTRL:down" & @CRLF)
        EndIf
WEnd

Func HotKey()
        HotKeySet("^x")
        BlockInput(1)
        ConsoleWrite("HotKey:ctrl+x" & @CRLF)
        Sleep(250)
        BlockInput(0)
        _WinAPI_Keybd_Event(0xA2, $KEYEVENTF_KEYUP)
        HotKeySet("^x", "HotKey")
EndFunc   ;==>HotKey



发表于 2020-9-4 07:32:07 | 显示全部楼层
可以稳定重现功能键被锁定的例子


#include <WinAPISys.au3>
#include <WinAPI.au3>
Example()

If BitAND(_WinAPI_GetKeyState(0xA2), 0x8000) <> 0 Then
        ConsoleWrite("CtrlKey:down" & @CRLF)
        _WinAPI_Keybd_Event(0xA2, $KEYEVENTF_KEYUP) ;释放CTRL
        ConsoleWrite("SetCtrlKey:up" & @CRLF)
Else
        ConsoleWrite("CtrlKey:up" & @CRLF)
EndIf

Func Example()
        _WinAPI_Keybd_Event(0xA2, 0) ;按下CTRL
        BlockInput(1)
        ;_WinAPI_Keybd_Event(0xA2, $KEYEVENTF_KEYUP) ;释放CTRL
        BlockInput(0)
EndFunc   ;==>Example
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-22 21:10 , Processed in 0.078512 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表