因此,我决定今晚想写一个小键盘记录器,只是为了了解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有关,而不与我的代码(编译并创建一个空白日志文件)有关,所以我仅包含了这两个代码段。

最佳答案

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

我在这里引用MSDN:



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

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

关于c++ - getAsyncKeyState无法识别键输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7524548/

10-11 18:29