getAsyncKeyState无法识别键输入

时间:2011-09-23 05:16:01

标签: c++ winapi input

所以我决定今晚想写一个小键盘记录器,只是为了了解getAsyncKeyState。我正在尝试将我的日志写入文件,但文件的内容显示为空白或向我抛出一个随机存储器地址(之前为0x28fef0)。我听说getAsyncKeyState在Windows 7 x64上运行不正常,是真的吗?

这是非常恶化的,我希望今晚真的能够让这个运行起来。

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

功能定义

void checkKey(DWORD_PTR key)
{
    ofstream out;
    out.open("log.txt");

        if (key==8)
            out << "[del]";
        if (key==13)
            out << "n";
        if (key==32)
            out << " ";
        if (key==VK_CAPITAL)
            out << "[CAPS]";
        if (key==VK_TAB)
            out << "[TAB]";
        if (key==VK_SHIFT)
            out << "[SHIFT]";
        if (key==VK_CONTROL)
            out << "[CTRL]";
        if (key==VK_PAUSE)
            out << "[PAUSE]";
        if (key==VK_ESCAPE)
            out << "[ESC]";
        if (key==VK_END)
            out << "[END]";
        if (key==VK_HOME)
            out << "[HOME]";
        if (key==VK_LEFT)
            out << "[LEFT]";
        if (key==VK_UP)
            out << "[UP]";
        if (key==VK_RIGHT)
            out << "[RIGHT]";
        if (key==VK_DOWN)
            out << "[DOWN]";
        if (key==VK_SNAPSHOT)
            out << "[PRINT]";
        if (key==VK_NUMLOCK)
            out << "[NUM LOCK]";
        if (key==190 || key==110)
            out << ".";
        if (key >=96 && key <= 105)
        {
            key -= 48;
            out << &key; // had ampersand
        }
        if (key >=48 && key <= 59)
            out << &key; // amp'd
        if (key !=VK_LBUTTON || key !=VK_RBUTTON)
        {
            if (key >=65 && key <=90)
            {
                if (GetKeyState(VK_CAPITAL))
                out << &key; // amp;d
            else
            {
                key = key +32;
                out << &key; // amp'd
            }
        }
        }
}

我对这个问题感到非常难过,非常感谢任何帮助。为什么这样的函数在64位系统上的工作方式不同?考虑到它是我唯一拥有的盒子,我无法在32位上运行它来检查它是否是一个孤立的问题。因为我假设它与getAsyncKeyState有关,而不是我的代码(编译并创建一个空白的日志文件),我只包括这两个代码片段。

3 个答案:

答案 0 :(得分:1)

嗯,首先,如果您正在编写密钥记录器,则不希望使用GetAsyncKeyState; GetAsyncKeyState在您调用函数的瞬间获取密钥的状态。您需要监听Windows消息,例如WM_KEYDOWN,WM_KEYUP,或者取决于记录器WM_CHAR,WM_UNICHAR等的目的......

答案 1 :(得分:1)

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

我在这里引用MSDN:

  

如果函数成功,则返回值指定是否为键   自上次调用GetAsyncKeyState以来是否被按下,以及是否   密钥当前上升或下降。如果设置了最高位,则   key为down,如果设置了最低有效位,则键为   在上一次调用GetAsyncKeyState之后按下。但是,你   不应该依赖这最后的行为;有关更多信息,请参阅   备注

最后一部分也意味着它对于键盘记录器来说完全没用。

PS:考虑使用GetKeyNameText将虚拟键码转换为有意义的名称。

答案 2 :(得分:1)

对于监视输入,可能需要使用键盘钩子(在MSDN上查找带有WH_KEYBOARD_LL的SetWindowsHookEx)。

如其他地方所述,您在这里没有正确使用GetAsyncKeyState。

至于为什么你会看到一个地址出现:

out << &key; // amp'd

这是代码中的几个地方:key是DWORD_PTR,因此&amp; key是一个指针 - 这可能是地址来自的地方。