使用GetAsyncKeyState()的键监听器/记录器

时间:2011-11-02 22:35:46

标签: c++ winapi

我看到很多人能够使用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);
     }
}
}

2 个答案:

答案 0 :(得分:1)

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

无论如何,假设您正在尝试记录按键,那么您的代码几乎可以正常工作。长话短说,你的循环延迟方式太长,因为它需要遍历每个字符200ms * 26 = 5.2 seconds。因此,如果您在5.2秒内键入“AAAB”,则只会注册“AB”。但如果延迟太短,那么你可能不止一次注册一个新闻。

阅读documentation for GetAsyncKeyState了解详情。

无论如何,我可能会选择上述文档备注中提到的不同功能,例如GetKeyboardState,因为您通常会使用类似GetAsyncKeyState的内容来注册热键按键或相似的东西。即。 GetAsyncKeyState很适合想要知道按键是否按下,而不是多少次按下按顺序等等。循环你的方式似乎很容易问题。

另外,不要做任何愚蠢的记录键......

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

我做了一些谷歌搜索,并且有一个开源宏程序,AutoHotkey使用这种方法,我想你可以看一下你是否想要。

答案 1 :(得分:0)

查看this

用法非常简单:

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
      }
   }
}