在其中一项申请中,我写道,需要消耗某些关键事件,以便处理其他申请。
在我的法典中,我做了一个礼让。 赞成:
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);
}
}
当我在诉讼结束时回到新的LRESULT(1)时(最后拟定的法典),所有关键事件都是消耗的。 然而,如果一经替换,
return lib.CallNextHookEx(hhk, nCode, wParam, info.getPointer());
as it should be, and only try to consume the main keyboard events i want to consume, it doesn t consume any of the keyboard events. Does anyone have any idea of why it won t let me consume the events I want or have any idea how to fix it so it will?