Использование jna для использования ключевых событий - PullRequest
1 голос
/ 12 января 2012

В одном из приложений, которые я пишу, мне нужно использовать определенные ключевые события, чтобы другие приложения не обрабатывали их.

В своем коде я создаю 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());

, как положено, и пытаюсь использовать только те события основной клавиатуры, которые я хочу использовать, он не потребляет никаких событий клавиатуры.Кто-нибудь знает, почему он не позволяет мне потреблять события, которые я хочу, или есть идеи, как это исправить?

1 Ответ

1 голос
/ 24 января 2012

Чтобы гарантировать, что ключ «потребляется», вам нужно избегать вызова следующего хука (т.е. возвращать LRESULT (1)) для всех вариантов события данного ключа, т.е. WM_KEYUP, WM_KEYDOWN и, возможно, WM_CHAR.

Некоторые приложения могут искать события нажатия клавиши, другие - нажатие клавиши, а другие - просто выводимый символ, поэтому вы должны использовать все события, относящиеся к данному нажатию клавиши, чтобы заставить указанное нажатие клавиши "исчезать" ».

...