使用 KeyboardProc / SetWindowsHookEx 从注入的 DLL 中挂钩键盘

Posted

技术标签:

【中文标题】使用 KeyboardProc / SetWindowsHookEx 从注入的 DLL 中挂钩键盘【英文标题】:Hook keyboard from injected DLL using KeyboardProc / SetWindowsHookEx 【发布时间】:2011-07-08 23:17:27 【问题描述】:

注意:我使用的是纯 C。不是 C++,不是 C#。

我正在开发一个模组。我已经编写了一个有效的 DLL 注入器,以及要注入的 DLL。除了用户输入之外,一切都很顺利。

我希望能够使用热键,因此我尝试使用 SetWindowsHookEx 设置键盘挂钩。 以下是我的回调函数:

LRESULT CALLBACK keyboardHook(int nCode, WPARAM wParam, LPARAM lParam)

    printf("key touched\n");
    if (wParam == VK_F5)
    
        keyEvent = VK_F5;
    
    return CallNextHookEx(NULL, nCode, wParam, lParam);

这就是我的设置方式:

HHOOK kbHookHandle = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)keyboardHook, NULL, GetCurrentThreadId());

if (kbHookHandle != NULL)

    printf("keyboard hook successful!\n");

else

    printf("keyboard hook failed!\n");

据我所知,钩子设置得很好(我曾经遇到过无效参数的问题,但通过使用 GetCurrentThreadID 解决了这个问题)。它返回一个不为 NULL 的句柄。

但是每当我按下一个键时,就没有输出。

进一步澄清: 上面的代码来自注入的 DLL。所以它实际上“属于”游戏过程。我已经使用 AllocConsole 分配了一个控制台,用于打印调试消息。

我做错了什么?

编辑: 澄清(甚至更多):列出的代码来自 injected DLL。这不是我用来注入 DLL 的方法 - 我编写了一个单独的(工作!)程序来做到这一点。

我使用 printf() 让一些人感到惊讶,因为它不会显示出来,考虑到我是从主机进程内部调用它的。 是的,我确实从主机进程内部调用它,但这不是问题,因为我已经分配了一个工作控制台。我使用的方法与提到的here

非常相似

编辑2: 我不是在问为什么 printf() 不起作用(因为它是),我是在问为什么这个键盘挂钩不起作用。

【问题讨论】:

你重定向标准输出了吗?如果在 AllocConsole 之后执行 printf 会怎样? 是的。 Printf() 正在正常工作,除了回调中的测试消息之外,我的所有消息都显示了 在注入的 dll 之外使用时,您的键盘挂钩代码是否有效,例如独立程序? 你想要一个全局热键还是只有一个在当前线程接收到输入时有效? @Null Set 好问题,我还没试过。会试一试。 @CodeInChaos 无论哪种方式都可以。用户在使用我的模组时会在游戏中,所以这并不重要。 【参考方案1】:

这是我在NoQuake ID Tech 游戏最小化器中检测按键按下和按键向上的方法。希望对您有所帮助。

【讨论】:

以上是关于使用 KeyboardProc / SetWindowsHookEx 从注入的 DLL 中挂钩键盘的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SetWindowsHookEx 和 LowLevelKeyboardProc 分配多个低级热键

对 TMonthCalendar 使用 ScaleBy 方法

为啥 SetWindowPos 不改变 ComboBoxEx 下拉高度?

mfc的一点总结-----Edit Control操作

Python - Windows - 将程序保持在另一个全屏应用程序之上

qt中如何实现界面最小化时呈现收缩形式