因此,我决定今晚想写一个小键盘记录器,只是为了了解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/