【问题标题】:Detect Shift key down using jna使用 jna 检测 Shift 键向下
【发布时间】:2011-09-23 05:47:10
【问题描述】:

我已经实现了 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);
}
}

【问题讨论】:

标签: java java-native-interface jna


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    注意当调用此回调函数以响应更改时 按键的状态,回调函数在按键之前被调用 键的异步状态被更新。 因此, 无法通过调用确定键的异步状态 从回调函数中获取AsyncKeyState。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 2018-02-15
      相关资源
      最近更新 更多