Frage

In einer der Anwendungen, die ich schreibe, muss ich bestimmte Schlüsselereignisse verwenden, damit andere Anwendungen sie nicht verarbeiten.

In meinem Code mache ich eine com.sun.jna.platform.win32.WinUser.LowLevelKeyboardProc wie folgt:

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);
}
}

Wenn ich am Ende meines Prozesses ein neues LRESULT (1) zurückgebe (am Ende auskommentierter Code), werden alle Tastaturereignisse verbraucht.Wenn ich es jedoch durch ersetze

return lib.CallNextHookEx(hhk, nCode, wParam, info.getPointer());

wie es sein sollte, und versuchen Sie nur, die wichtigsten Tastaturereignisse zu verwenden, die ich verwenden möchte. Es werden keine der Tastaturereignisse verwendet.Hat jemand eine Idee, warum ich nicht die gewünschten Ereignisse konsumieren kann, oder hat er eine Idee, wie ich das beheben kann, damit es funktioniert?

War es hilfreich?

Lösung

Um sicherzustellen, dass ein Schlüssel "verbraucht" wird, müssen Sie sicherstellen, dass Sie den nächsten Hook (dh die Rückgabe von LRESULT (1)) bei allen Ereignisvarianten eines bestimmten Schlüssels, dh WM_KEYUP, WM_KEYDOWN und möglicherweise, vermeidenWM_CHAR.

Einige Anwendungen suchen möglicherweise nach Tastendruckereignissen, andere nach Tastendruckereignissen und andere nur nach der erzeugten Zeichenausgabe. Sie müssen daher alle Ereignisse verwenden, die sich auf einen bestimmten Tastenanschlag beziehen, um diesen Tastenanschlag ordnungsgemäß auszuführen.verschwinden ".

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top