使用GetAsyncKeyState()的密钥侦听器/记录器

Key listener / logger using GetAsyncKeyState()

本文关键字:侦听器 记录器 密钥 GetAsyncKeyState 使用      更新时间:2023-10-16

我看到很多人都可以使用for循环来确定按下的键的值,例如它将是GetAsyncKeyState(41(,因此他们可以很容易地使用循环,但出于某种原因,只有当我键入GetAsyncKeyState(0x41(等时,它才对我有效,我能对此做些什么吗?这样我就可以循环使用它,而不必单独键入每个值?

int main()
{
while(!GetAsyncKeyState(VK_F8))
{
    for(int i=65; i<90; i++)
    {
        if(GetAsyncKeyState(i))
        {
        log << "HELLO DER";
        }
        Sleep(200);
     }
}
}

410x41是两个完全不同的值。第二个0x41是十进制值65的十六进制,它是"A"的ASCII代码。但我猜您已经知道了,因为您将i初始化为65(大写ASCII字母和VK代码匹配(。

无论如何,假设您正在尝试记录按键,您的代码在一定程度上几乎可以正常工作。长话短说,你的循环延迟太长了,以至于它无法迭代200ms * 26 = 5.2 seconds中的每个字符。因此,如果您在5.2秒内键入"AAAB",则只会注册"AB"。但如果延迟时间太短,那么您可能会注册一次以上的按压。

有关详细信息,请阅读GetAsyncKeyState的文档。

无论如何,我可能会选择上面文档备注中提到的不同函数,比如GetKeyboardState,因为你通常会使用GetAsyncKeyState之类的函数来注册热键或类似的东西。例如,GetAsyncKeyState非常适合想知道按键是否被按下,而不是按下了多少次、按下的顺序等。这样的循环似乎真的很容易出现问题。

此外,不要做任何愚蠢的日志键。。。

编辑:实际上GetKeyboardState仍然不是一个好的解决方案。用SetWindowsHookEx设置键盘挂钩是一个更好的选择。您可以使用WH_KEYBOARD_LL挂钩类型设置具有LowLevelKeyboardProc回调的低级键盘挂钩。

我在谷歌上搜索了一下,有一个开源的宏程序AutoHotkey使用了这种方法,我想如果你愿意的话,你可以看看。

看看这个。

用法非常简单:

unsigned char kbstate[256];
if(!GetKeyboardState(kbstate))
{
   // can not get keyboard state
}else{
   for(int i=0; i<256: i++)
   {
      if(kbstate[i] & 0x1)
      {
         // the key is pressed, do something
      }
   }
}