gpt4 book ai didi

c - 键盘 Hook

转载 作者:行者123 更新时间:2023-11-30 21:02:17 29 4
gpt4 key购买 nike

我正在尝试编写c程序来统计分析某些键盘按键的使用情况。首先,我想使用全局钩子(Hook)创建一个键盘记录器并将其记录到文件中。

这是我编写的代码的第一部分:

#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))
{

}
}
  1. 为什么我必须创建无限循环?没有它就无法工作。
  2. 我读到,对于全局钩子(Hook),SetWindowHookEx 中的第二个参数应该指向 EXTERNAL DLL 中的钩子(Hook)过程。它工作得很好,为什么只打印虚拟代码。如何将其转换为“常规按键”而不需要每个虚拟按键的开关盒?有什么有效的办法吗?
  3. 如果需要外部dll应该如何编写并根据我编写的代码从main调用?

最佳答案

  1. 您需要一个消息循环来处理键盘事件。这在documentation中有明确说明。 :

This hook is called in the context of the thread that installed it. The call is made by sending a message to the thread that installed the hook. Therefore, the thread that installed the hook must have a message loop.

  • 大多数全局 Hook 在每个正在运行的进程的上下文中运行,因此 Hook 必须位于 DLL 中,以便可以将其注入(inject)到其他进程中。但不是WH_KEYBOARD_LL(见上文)。至于按键本身,KBDLLHOOKSTRUCT仅提供虚拟按键扫描码。要将它们转换为字符,请使用 MapVirtualKey() , MapVirtualKeyEx() , ToUnicode() ,或ToUnicodeEx() .

  • WH_KEYBOARD_LL 不需要 DLL。见上文。

  • 关于c - 键盘 Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31221478/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com