【问题标题】:WINAPI's message loops drives me crazyWINAPI 消息循环让我发疯
【发布时间】:2012-04-20 04:13:49
【问题描述】:

我一直在尝试使用 JNI 实现简单的低级 keyhook,并且一切顺利,直到我发现当 DLL 处于无限循环(消息循环)时我无法调用这些方法。所以我决定创建新线程,但不知何故,在我创建它之后,消息循环在它自己的循环上运行,低级 keyhook 停止响应,这意味着它不再调用 keyproc,我不知道这是为什么?还有其他解决方法吗?我需要能够在键盘挂钩仍在运行时调用 DLL 的方法。

我目前的代码很简单

注册键盘钩子:

keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, keyboardProc, hInstance, 0);

启动线程

HANDLE threadHandle = CreateThread(NULL, 0, ThreadProc, NULL, 0, &threadId);

我的键盘进程和线程进程如下:

DWORD WINAPI ThreadProc(LPVOID lpVoid) {
    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}

LRESULT CALLBACK keyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
    KBDLLHOOKSTRUCT keyEvent = *((KBDLLHOOKSTRUCT*)lParam);
    jint vkCode = keyEvent.vkCode;
    jint flags = keyEvent.flags;
    jint action = wParam;
    (*globalEnv).CallVoidMethod(globalObj, keyboardMethodId, vkCode, flags, action);
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

我哪里出错了? 即使我为从未调用过的 keyproc 添加简单的日志记录,我也确信它不是 java。但是如果我停止使用线程并在主线程上运行消息循环,它工作正常,但 DLL 不会响应它之后的方法调用。

【问题讨论】:

标签: c++ multithreading winapi java-native-interface


【解决方案1】:

您需要在调用 SetWindowsHookEx() 的同一线程上抽取消息循环。因此,只需将调用移至您的 ThreadProc()。当然,请注意您的 CallVoidMethod() 回调也在同一个线程上运行,因此请小心您在该函数中所做的事情。您访问的任何共享状态都需要使用锁进行保护。

【讨论】:

  • 你在那里提出了一些有效的观点。我会把电话移到那里试试看!锁只是为了确保两个线程没有并发访问来弄乱一些数据吗?
【解决方案2】:

您正在尝试安装桌面范围的挂钩,该挂钩跨越桌面的所有进程。也就是说,您的 DLL 被映射到具有特定于进程的全局变量集的多个进程中。您在其他进程中没有有效的globalEnv,您可能会遇到访问冲突或类似错误(可以使用共享数据段创建全局变量,请参阅this article for details)。

要安装线程特定的钩子,您将需要不同类型的钩子(WH_KEYBOARD_LL 仅限全局!)和SetWindowsHookEx 中的非零最后一个参数。

【讨论】:

  • 这正是我想要的,我需要 dektop 范围的钩子来附加快捷键等,它运行良好,直到我尝试在外部线程上运行消息循环,它甚至可能吗?附加钩子后,我只需要 dll 能够响应我的方法调用。
  • 那你的globalEnv 是什么?
  • 太糟糕了,不能接受回答,你帮了大忙! :) 谢谢老兄,搞定了! :P
  • 其实 Hans 在上面是正确的——这个钩子没有注入到其他进程中,而是在调用线程上工作,所以在SetWindowsHookEx 调用线程上运行消息泵是解决这类问题的关键问题。
猜你喜欢
  • 2011-06-10
  • 2011-05-30
  • 2012-11-02
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
相关资源
最近更新 更多