В одном из приложений, которые я пишу, мне нужно использовать определенные ключевые события, чтобы другие приложения не обрабатывали их.
В своем коде я создаю com.sun.jna.platform.win32.WinUser.LowLevelKeyboardProcнапример:
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());
, как положено, и пытаюсь использовать только те события основной клавиатуры, которые я хочу использовать, он не потребляет никаких событий клавиатуры.Кто-нибудь знает, почему он не позволяет мне потреблять события, которые я хочу, или есть идеи, как это исправить?