c - 使用 KeyboardProc/SetWindowsHookEx 从注入(inject)的 DLL Hook 键盘

标签 c setwindowshookex dll-injection

注意:我在纯 C 中工作。不是 C++,也不是 C#。

我正在开发一个模组。我已经编写了一个可用的 DLL 注入(inject)器,以及要注入(inject)的 DLL。除用户输入外,一切正常。

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

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");
}

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

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

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

我做错了什么?

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

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

编辑2: 我不是在问为什么 printf() 不工作(因为它是),我是在问为什么这个 keyboardhook 不工作。

最佳答案

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

关于c - 使用 KeyboardProc/SetWindowsHookEx 从注入(inject)的 DLL Hook 键盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5196596/

相关文章:

C 信号处理错误,发出子父联系

c# - 找不到模块

c++ - SetWindowshookEx 有时在 dll 注入(inject)后不起作用

c - 如何将整数数组传递给库函数

c - C 中两个程序之间的管道

c - C语言变量名存放在内存的哪一段?

winapi - Windows 资源管理器不接收 WM_DESTROY。如何检测用户何时关闭资源管理器窗口?

c# - 如何将 C++ SetWindowsHookEx 移植到 C# 或者这是不可能的?

c++ - CreateRemoteThread() 成功但不执行任何操作

c++ - 在注入(inject)的 Dll 的 DllMain 中运行代码会导致注入(inject)超时