C++ getAsyncKeyState无法识别密钥输入

C++ getAsyncKeyState无法识别密钥输入,c++,winapi,input,C++,Winapi,Input,所以我决定今晚写一个小键盘记录器,只是为了了解getAsyncKeyState。我试图让我的日志写入一个文件,但该文件的内容要么显示为空白,要么向我抛出一个随机内存地址(之前为0x28fef0)。我听说getAsyncKeyState在Windows7x64上运行不好,是真的吗 这真是太让人恼火了,我本来希望今晚能让这一切顺利进行 while(1) { Sleep(20); for(DWORD_PTR key = 8; key <= 190;

所以我决定今晚写一个小键盘记录器,只是为了了解getAsyncKeyState。我试图让我的日志写入一个文件,但该文件的内容要么显示为空白,要么向我抛出一个随机内存地址(之前为0x28fef0)。我听说getAsyncKeyState在Windows7x64上运行不好,是真的吗

这真是太让人恼火了,我本来希望今晚能让这一切顺利进行

    while(1)
    {
        Sleep(20);
        for(DWORD_PTR key = 8; key <= 190; key++)
        {
            if (GetAsyncKeyState(key) == HC_ACTION)
                checkKey(key);
        }
    }
while(1)
{
睡眠(20);

对于(DWORD_PTR key=8;key首先,如果您正在编写一个键记录程序,那么您不想使用GetAsyncKeyState;GetAsyncKeyState在您调用函数的瞬间获取键的状态。您需要监听Windows消息,例如WM_KEYDOWN、WM_keydup或取决于记录器WM_CHAR的用途,WM_UNICHAR等。

您使用的函数不正确。在请求帮助之前阅读文档通常是个好主意

我将在这里引用MSDN:

如果函数成功,返回值将指定 自上次调用GetAsyncKeyState后被按下,并且 键当前为向上或向下。如果设置了最高有效位,则 键是向下的,如果设置了最低有效位,则键是向下的 在上一次调用GetAsyncKeyState后按。但是 不应依赖最后一种行为;有关更多信息,请参阅 评论

最后一部分也意味着它对一个键盘记录者来说是完全无用的


PS:考虑使用<代码> GeKyNyMeXEX>代码>将虚拟密钥代码翻译成有意义的名称。

< P>监视输入,类似键盘挂钩的方法可能是(用MSDN查找WHKEKBOBOADARLL的SETWORKOWSWORKEX)。

正如其他地方所指出的,这里没有正确使用GetAsyncKeyState

至于您看到地址出现的原因:

out << &key; // amp'd

out谢谢。从现在起,我一定会仔细检查MSDN,我一定是忽略了它。如果您想了解整个键盘(即所有键)的状态,不要多次调用
GetAsyncKeyState
。相反,调用
GetKeyboardState
。这样会执行得更好。但是对于键盘记录程序,您需要使用键盘挂钩或收听
WM\u KEYUP
WM\u KEYDOWN
,等等。
out << &key; // amp'd