manlty 发表于 2010-10-12 22:30:24

自定义热键的问题!可能是BUG?

本帖最后由 manlty 于 2010-10-12 23:11 编辑

用HOTKEYSET定义了热键,比如CTRL+W
现在问题来了,如果热键触发的函数里用到blockinput(1)等鼠标键盘函数,函数执行完了后,CTRL键被锁死,也就是需要手动再按一下CTRL键才能复位,要不这个键总是按下状态,为什么会有这种问题呢?如何解决?

manlty 发表于 2010-10-13 10:41:37

高手能解决吗

afan 发表于 2010-10-13 10:49:34

适当位置加 Send('^')

manlty 发表于 2010-10-13 19:55:09

没用,不信大伙试试

manlty 发表于 2010-10-13 20:25:15

真是奇怪,不知道出这个问题的原理是什么
在函数最后send("^")也没用

afan 发表于 2010-10-13 21:54:26

那就试试 Send('{LCTRL up}')

manlty 发表于 2010-10-13 23:10:59

都试过了,不行
会不会是按热键的时候,在脚本运行到blockinput(1)(0)之间松开了按键,由于屏蔽掉键盘动作,松开无效,导致CTRL键被锁定为down?但是奇怪,为什么代码最后send("^")确不能复位?难道send和手按不是一回事?

gyp2000 发表于 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

gyp2000 发表于 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



gyp2000 发表于 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
页: [1]
查看完整版本: 自定义热键的问题!可能是BUG?