低电平键盘钩C

低电平键盘钩C,c,winapi,C,Winapi,我试着用c写一个小钩子程序。 程序不起作用,我也不知道为什么 #include <stdio.h> #include <stdlib.h> #include <Windows.h> LRESULT CALLBACK LowLevelKeyboardProc( int nCode, WPARAM wParam, LPARAM lParam ) { if(nCode >= 0) { char key; KBD

我试着用c写一个小钩子程序。 程序不起作用,我也不知道为什么

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

LRESULT CALLBACK LowLevelKeyboardProc( int nCode, WPARAM wParam, LPARAM lParam )
{
    if(nCode >= 0)
    {
        char key;
        KBDLLHOOKSTRUCT *pKeyBoard = (KBDLLHOOKSTRUCT *)lParam;
        key = (char)pKeyBoard->vkCode;
        printf("%c\n",key);
    }
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

int main(void) {
    HINSTANCE instance = LoadLibrary("User32");
    HHOOK hook = SetWindowsHookEx( WH_KEYBOARD_LL, LowLevelKeyboardProc, instance, 0);
    getchar();
    UnhookWindowsHookEx(hook);
    printf("ready");
    return EXIT_SUCCESS;
}
#包括
#包括
#包括
LRESULT回调LowLevelKeyboardProc(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM)
{
如果(nCode>=0)
{
字符键;
KBDLLHOOKSTRUCT*pKeyBoard=(KBDLLHOOKSTRUCT*)LPRAM;
key=(char)pKeyBoard->vkCode;
printf(“%c\n”,键);
}
返回CallNextHookEx(NULL、nCode、wParam、lParam);
}
内部主(空){
HINSTANCE实例=LoadLibrary(“User32”);
HHOOK hook=setWindowshookx(WH_KEYBOARD_LL,LowLevelKeyboardProc,实例,0);
getchar();
解开钩(钩);
printf(“就绪”);
返回退出成功;
}
我认为错误在SetWindowsHookEx函数的某个地方。 当我启动它时,它只会将键盘输入延迟几秒钟,而不会调用LowLevelKeyboardProc函数

代码中有什么错误

感谢您的帮助

如果您阅读了,它会说:

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

。。。但是,WH\u-KEYBOARD\u-LL钩子不会被注入到另一个进程中。相反,上下文切换回安装钩子的进程,并在其原始上下文中调用它。然后,上下文切换回生成事件的应用程序

您的代码没有消息循环来接收钩子的消息

请尝试类似以下内容:

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

LRESULT CALLBACK LowLevelKeyboardProc( int nCode, WPARAM wParam, LPARAM lParam )
{
    if (nCode == HC_ACTION)
    {
        KBDLLHOOKSTRUCT *pKeyBoard = (KBDLLHOOKSTRUCT *)lParam;
        char key = (char) pKeyBoard->vkCode;
        printf("%c\n", key);
        PostQuitMessage(0);
    }
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

int main(void)
{
    HHOOK hook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, NULL, 0);
    if (!hook)
    {
        printf("error setting hook: %u", GetLastError());
        return -1;
    }

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    UnhookWindowsHookEx(hook);

    printf("ready");
    return EXIT_SUCCESS;
}
#包括
#包括
#包括
LRESULT回调LowLevelKeyboardProc(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM)
{
如果(nCode==HC\U动作)
{
KBDLLHOOKSTRUCT*pKeyBoard=(KBDLLHOOKSTRUCT*)LPRAM;
char key=(char)pKeyBoard->vkCode;
printf(“%c\n”,键);
PostQuitMessage(0);
}
返回CallNextHookEx(NULL、nCode、wParam、lParam);
}
内部主(空)
{
HHOOK hook=setWindowshookx(WH_KEYBOARD,LL,LowLevelKeyboardProc,NULL,0);
如果(!hook)
{
printf(“设置钩子时出错:%u”,GetLastError());
返回-1;
}
味精;
while(GetMessage(&msg,NULL,0,0)>0)
{
翻译信息(&msg);
发送消息(&msg);
}
解开钩(钩);
printf(“就绪”);
返回退出成功;
}

请解释什么不起作用。此钩子要求您泵送一个消息循环,而不是调用getchar()。据我所知,您必须将代码拆分为一个包含钩子代码的dll和一个将此dll注入运行进程的程序。@vlad_tepesch-不适用于WH_KEYBOARD_LL,IIRC.1)使用
HINSTANCE
是错误的;Windows不关心您是否已加载user32.dll,所需的
HINSTANCE
是Windows应用程序本身的
HINSTANCE
(它会自动使用并接收
HINSTANCE
作为第一个参数)。2) 您不需要检查调用
SetWindowsHookEx
的返回值来查看调用是否成功;你只是假设它会。阅读文档,了解它返回了什么,如果它无法找到原因,你应该怎么做。我不能100%确定你是对的。根据
getchar()
和其他“easy win”函数的使用情况,我们讨论的是“控制台windows应用程序”。控制台AFAIK是通过标准的windows消息子系统模拟的,实际上,
getchar()
是一个消息循环,在格式化的字符到达时终止。谢谢,现在我将尝试100%理解它。我以前从未见过这个GetMessage循环。@瓦尔多:使用
main()
意味着这是一个控制台应用程序。但控制台应用程序没有自己的消息队列或消息循环。默认情况下,您必须自己为其编码。控制台应用程序是一个独立于控制台本身的进程。控制台窗口进程处理控制台的UI消息,然后根据需要将输入转发给正在运行的控制台应用程序进程。@RemyLebeau-不知道这一点。有道理。谢谢