我一直試圖使用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