私が書いているアプリケーションの1つでは、特定のキーイベントを消費する必要があるため、他のアプリケーションでそれらを処理しないようにする必要があります。私はそうのようなcom.sun.jna.platform.win32.WinUser.LowLevelKeyboardProcを作る私のコードでjnaを使用してキーイベントを消費する
:
import com.sun.jna.Native;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.WinDef.HMODULE;
import com.sun.jna.platform.win32.WinDef.LRESULT;
import com.sun.jna.platform.win32.WinDef.WPARAM;
import com.sun.jna.platform.win32.WinUser.HHOOK;
import com.sun.jna.platform.win32.WinUser.KBDLLHOOKSTRUCT;
import com.sun.jna.platform.win32.WinUser.LowLevelKeyboardProc;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinUser;
public class KeyHook implements Runnable{
private static volatile boolean quit = false;
private static HHOOK hhk;
private static LowLevelKeyboardProc keyboardHook;
private Main main;
User32 lib;
HMODULE hMod;
public boolean isHooked = false;
public KeyHook(final Main main) {
this.main = main;
lib = User32.INSTANCE;
hMod = Kernel32.INSTANCE.GetModuleHandle(null);
Native.setProtected(true);
}
@Override
public void run() {
keyboardHook = new LowLevelKeyboardProc() {
public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT info) {
if (nCode >= 0 && main.getPane().getTabCount() > 0) {
switch (wParam.intValue()) {
case WinUser.WM_KEYUP:
if(info.vkCode == main.getListenMouse()){
main.listen();
return new LRESULT(1);
}
else if(info.vkCode == main.getStopListenMouse()){
main.stopListening();
return new LRESULT(1);
}
else if(info.vkCode == main.getStart()){
main.start();
return new LRESULT(1);
}
else if(info.vkCode == main.getPause()){
main.pause();
return new LRESULT(1);
}
else if(info.vkCode == main.getStop()){
main.stopRunning();
return new LRESULT(1);
}
else if(info.vkCode == 0x7B){
main.nextTab();
return new LRESULT(1);
}
break;
case WinUser.WM_KEYDOWN:
break;
case WinUser.WM_SYSKEYUP:
break;
case WinUser.WM_SYSKEYDOWN:
quit = true;
break;
}
}
return lib.CallNextHookEx(hhk, nCode, wParam, info.getPointer());
//return new LRESULT(1);
}
};
hhk = lib.SetWindowsHookEx(WinUser.WH_KEYBOARD_LL, keyboardHook, hMod, 0);
}
}
私は私のPROCの最後に新しいLRESULT(1)を返す場合には(コメント終了コード)、すべてのキーボードイベントが消費されます。それは、唯一私が消費したいメインのキーボードイベントを消費してみてくださいしかし、私は
return lib.CallNextHookEx(hhk, nCode, wParam, info.getPointer());
と交換するとき、それはキーボードイベントのいずれかを消費しません。誰かが私が望む出来事を消費させないようにする理由があるのか、どうやってそれを修正するのか考えていない理由を知っている人はいますか?
イベントを消費したくない場合にのみ、次のフックを呼び出し、* do *を実行したときにLRESULT(1)を返します。おそらく、消費可能なイベントにフラグを立てようとしているコードが実際に呼び出されていないのでしょうか? – technomage
http://stackoverflow.com/questions/8540891/using-jna-to-keyhook-and-consume – technomage
を参照してください。@technomage:私は個人的なイベントのために消費したいときにLRESULT(1)を返します。私が言っていることは、私が個々の出来事のためにそれをするとき、それを消費しないということです。そしてその質問をしばらく前から私の質問だった、私はLRESULT(1)でnextHookを置き換えるときに解決しますが、そのとき、すべてのキーイベントを消費します。 –