JNIを使用して単純な低レベルのキーフックを実装しようとしましたが、DLLが無限ループ(メッセージループ)にある間はメソッドを呼び出すことができないと考えるまで、すべてうまくいきました。だから私は新しいスレッドを作成することにしましたが、どういうわけか、メッセージループが独自のループで実行されるように作成した後、低レベルのキーフックが応答を停止し、keyproc をもう呼び出さないことを意味します。これに対する他の回避策はありますか?キーボード フックがまだ機能している間に、DLL のメソッドを呼び出せるようにする必要があります。
私の現在のコードは次のように単純です
キーボードフックの登録:
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 はその後のメソッド呼び出しに応答しません。