键盘挂钩

时间:2015-07-04 14:02:10

标签: c windows winapi dll keyboard-hook

我正在尝试编写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))
    {

    }
}
  1. 为什么我要创建无限循环?没有它它就无法工作。
  2. 我读到了对于全局钩子,SetWindowHookEx中的第二个参数应该指向EXTERNAL DLL中的钩子过程。它工作正常,为什么只打印虚拟代码。如何在没有每个虚拟键的开关盒的情况下将其转换为“常规键”?有没有有效的方法?
  3. 如果需要外部dll,应该根据我编写的代码从main编写和调用它?

1 个答案:

答案 0 :(得分:1)

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

    在安装它的线程的上下文中调用此钩子。通过向安装了挂钩的线程发送消息来进行调用。因此,安装钩子的线程必须有一个消息循环

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

    2. WH_KEYBOARD_LL不需要DLL。见上文。

相关问题