Closed. This question needs to be more focused。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?更新问题,使其仅通过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