【发布时间】:2015-09-22 03:52:26
【问题描述】:
我正在尝试编写 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中的第二个参数应该指向外部 DLL 中的挂钩过程。它工作正常,为什么只打印虚拟代码。如何将其转换为“常规键”而无需为每个虚拟键切换案例?有没有有效的方法? - 如果需要外部 dll,应该如何根据我编写的代码从 main 编写和调用它?
【问题讨论】:
-
C 中没有键盘。
-
这个问题好像是三个问题。因此,我认为它“太宽泛了”。
-
1:操作系统必须闯入您的程序才能进行 hook_proc() 调用。只有当您的主线程可以安全地中断以进行调用时,它才会这样做。 GetMessage() 是producer-consumer problem 的通用解决方案。 2:WH_KEYBOARD_LL 比较特殊,不需要DLL。
-
我之前也遇到过第二个问题(在编写我自己的间谍程序时),到目前为止我发现的最优雅的解决方案是......实现你自己的键盘驱动程序并以某种方式把它进入您客户的系统(或受害者的系统:D)。如果你懂俄语,我可以给你一些俄语教程的链接。
-
while(<expression that can evaluate to false>)有什么无限可能?
标签: c windows winapi dll keyboard-hook