我一直试图使用JNI实现简单的低级别keyhook,一切都很顺利我想我无法在DLL在无限循环(消息循环)时调用方法。所以我决定创建新的线程,但不知何故,我做了它之后,消息循环运行在它自己的循环中,低级别keyhook停止响应,意味着它不再调用keyproc,我不知道这是为什么?有没有其他的解决方法呢?我需要能够在键盘挂钩仍在运行时调用DLL的方法。WINAPI的消息循环驱使我疯狂
我当前的代码很简单,只要
寄存器键盘钩子:
keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, keyboardProc, hInstance, 0);
启动线程
HANDLE threadHandle = CreateThread(NULL, 0, ThreadProc, NULL, 0, &threadId);
我的键盘proc和ThreadProc的有以下几种:
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不会响应之后的方法调用。
http://stackoverflow.com/questions/617248/can-the-hwnd-from-createwindow-createdialog-be-getmessaged-from-another-thread – JosephH 2012-04-06 15:05:59