我正在尝试编写c程序,它统计分析了一些键盘键的使用。 首先,我想使用全局钩子创建一个键盘记录器并将其记录到文件中。
这是我写的代码的第一部分:
#include <stdio.h>
#include <Windows.h>
HHOOK hook;
LRESULT CALLBACK hook_proc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (wParam == WM_KEYDOWN)
{
KBDLLHOOKSTRUCT kbdstruct = *((KBDLLHOOKSTRUCT*)lParam);
char ch = kbdstruct.vkCode;
printf("%c", ch);
}
return CallNextHookEx(hook, nCode, wParam, lParam);
}
void main()
{
MSG msg;
hook = SetWindowsHookEx(WH_KEYBOARD_LL, HOOKPROC(hook_proc), NULL, 0);
while (GetMessage(&msg, NULL, 0, 0))
{
}
}
SetWindowHookEx
中的第二个参数应该指向EXTERNAL DLL中的钩子过程。它工作正常,为什么只打印虚拟代码。如何在没有每个虚拟键的开关盒的情况下将其转换为“常规键”?有没有有效的方法?答案 0 :(得分:1)
在安装它的线程的上下文中调用此钩子。通过向安装了挂钩的线程发送消息来进行调用。因此,安装钩子的线程必须有一个消息循环。
大多数全局挂钩在每个正在运行的进程的上下文中运行,因此挂钩必须位于DLL中,以便可以将其注入其他进程。但不是WH_KEYBOARD_LL
(见上文)。至于密钥本身,KBDLLHOOKSTRUCT
仅提供虚拟密钥和扫描代码。要将它们转换为字符,请使用MapVirtualKey()
,MapVirtualKeyEx()
,ToUnicode()
或ToUnicodeEx()
。
WH_KEYBOARD_LL
不需要DLL。见上文。