使用jna检测下移键

问题描述 投票:0回答:2

我已经实现了keyBoardHook,但是在按下shift键时无法检测到按下的字符。

我已经尝试使用Windows的GetAsyncKeyState函数来检测何时按下Shift键。但这不会处理shift + 2 = @。它会覆盖shift键并显示2的键代码。

我可以获取每个键,但是Shift + 2被检测为两个单独的键(即使[SHIFT + 2]在键盘上提供@)。 IE:程序同时输出SHIFT和2,但不输出它们产生的结果:@。

问题:

按下Shift键时如何检测产生的字符。

我到目前为止已编写的代码。

public class Keyhook {
private static volatile boolean quit;
private static HHOOK hhk;
private static LowLevelKeyboardProc keyboardHook;

public static void main(String[] args) {
    final User32 lib = User32.INSTANCE;
    HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);
    keyboardHook = new LowLevelKeyboardProc() {
        public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT info) {
            if (nCode >= 0) {
                switch (wParam.intValue()) {
                    case User32.WM_KEYUP:

                    break;
                    case User32.WM_KEYDOWN: 
                    if(lib.GetAsyncKeyState(160) == 1){
                         System.out.println(info.vkCode);    
                      }
                    break;
                    case User32.WM_SYSKEYUP:

                        break;
                    case User32.WM_SYSKEYDOWN:
                        System.err.println("in callback, key=" + info.vkCode);
                        if (info.vkCode == 81) {
                            quit = true;
                        }
                }
            }
            return lib.CallNextHookEx(hhk, nCode, wParam, info.getPointer());
        }
    };
    hhk = lib.SetWindowsHookEx(User32.WH_KEYBOARD_LL, keyboardHook, hMod, 0);
    System.out.println("Keyboard hook installed, type anywhere, 'q' to quit");
    //noinspection ConstantConditions
    new Thread() {
        public void run() {
            while (!quit) {
                try {
                    Thread.sleep(10);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            System.err.println("unhook and exit");
            lib.UnhookWindowsHookEx(hhk);
            System.exit(0);
        }
    }.start();

    // This bit never returns from GetMessage
    int result;
    MSG msg = new MSG();
    while ((result = lib.GetMessage(msg, null, 0, 0)) != 0) {
        if (result == -1) {
            System.err.println("error in get message");
            break;
        } else {
            System.err.println("got message");
            lib.TranslateMessage(msg);
            lib.DispatchMessage(msg);
        }
    }
    lib.UnhookWindowsHookEx(hhk);
}
}

我已经实现了keyBoardHook,但是在按下shift键时无法检测到按下的字符。我试过使用Windows的GetAsyncKeyState函数来检测何时Shift键为...

java java-native-interface jna
2个回答
0
投票

没有简单的方法来预测生成的输出(某些组合键不会产生任何输出)。如果Java生成KeyTyped事件,则将在事件中提供生成的字符串,但我认为没有任何API(Java或本机)可以为您提供到键字符串映射的键击。]]


0
投票

根据LowLevelKeyboardProc文档,您无法检测到Shift键的原因:

© www.soinside.com 2019 - 2024. All rights reserved.