自定义热键的问题!可能是BUG?
本帖最后由 manlty 于 2010-10-12 23:11 编辑用HOTKEYSET定义了热键,比如CTRL+W
现在问题来了,如果热键触发的函数里用到blockinput(1)等鼠标键盘函数,函数执行完了后,CTRL键被锁死,也就是需要手动再按一下CTRL键才能复位,要不这个键总是按下状态,为什么会有这种问题呢?如何解决? 高手能解决吗 适当位置加 Send('^') 没用,不信大伙试试 真是奇怪,不知道出这个问题的原理是什么
在函数最后send("^")也没用 那就试试 Send('{LCTRL up}') 都试过了,不行
会不会是按热键的时候,在脚本运行到blockinput(1)(0)之间松开了按键,由于屏蔽掉键盘动作,松开无效,导致CTRL键被锁定为down?但是奇怪,为什么代码最后send("^")确不能复位?难道send和手按不是一回事? 目前发现是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 本帖最后由 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
可以稳定重现功能键被锁定的例子
#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
页:
[1]