Closed. This question needs to be more focused。它当前不接受答案。
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
4年前关闭。
我正在尝试用c程序编写程序,该程序可以对一些键盘按键的使用进行统计分析。
首先,我想使用全局挂钩创建一个键盘记录程序并将其记录到文件中。
这是我编写的代码的第一部分:
为什么我必须创建无限循环?没有它是行不通的。
我读到对于全局钩子,
如果需要外部dll,应如何根据我编写的代码从主文件中编写和调用它?
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
4年前关闭。
我正在尝试用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中的钩子过程。为什么只打印虚拟代码,效果很好。如何为每个虚拟键将其转换为“常规键”而无需切换大小写?有没有有效的方法?如果需要外部dll,应如何根据我编写的代码从主文件中编写和调用它?
最佳答案
您需要一个消息循环来处理键盘活动。 documentation中明确指出:
该挂钩在安装它的线程的上下文中被调用。通过向安装钩子的线程发送消息来进行调用。因此,安装挂钩的线程必须具有消息循环。
大多数全局挂钩在每个正在运行的进程的上下文中运行,因此该挂钩必须位于DLL中,以便可以将其注入到其他进程中。但不是WH_KEYBOARD_LL
(请参见上文)。至于密钥本身,KBDLLHOOKSTRUCT
仅提供虚拟密钥和扫描代码。要将它们转换为字符,请使用MapVirtualKey()
,MapVirtualKeyEx()
,ToUnicode()
或ToUnicodeEx()
。WH_KEYBOARD_LL
不需要DLL。往上看。
08-06 14:13