JNA KeyboardUtils.isPressed 不能使用箭头键

我正在尝试创建一个调用 JNA 的KeyboardUtils类来检查 Windows 上的关键状态的示例(类似于 Win32 的GetAsyncKeyState())。


这是我的代码:


package com.foo;


import com.sun.jna.platform.KeyboardUtils;

import java.awt.event.KeyEvent;


public class Main {

    public static void main(String[] args) {

        new Thread() {

            @Override

            public void run() {

                System.out.println("Watching for Left/Right/Up/Down or WASD.  Press Shift+Q to quit");

                while (true) {

                    try

                    {

                        Thread.sleep(10);

                        if (KeyboardUtils.isPressed(KeyEvent.VK_DOWN) || KeyboardUtils.isPressed(KeyEvent.VK_S) )

                        {

                            System.out.println("Down");

                        }

                        if (KeyboardUtils.isPressed(KeyEvent.VK_UP) || KeyboardUtils.isPressed(KeyEvent.VK_W) )

                        {

                            System.out.println("Up");

                        }

                        if (KeyboardUtils.isPressed(KeyEvent.VK_LEFT) || KeyboardUtils.isPressed(KeyEvent.VK_A) )

                        {

                            System.out.println("Left");

                        }

                        if (KeyboardUtils.isPressed(KeyEvent.VK_RIGHT) || KeyboardUtils.isPressed(KeyEvent.VK_D) )

                        {

                            System.out.println("Right");

                        }

                        if (KeyboardUtils.isPressed(KeyEvent.VK_Q) && KeyboardUtils.isPressed(KeyEvent.VK_SHIFT) )

                        {

                            break;

                        }

                    }

                    catch(Exception e)

                    { }

                }

                System.exit(0);

            }

        }.start();

    }

}

这工作正常并检测 WASD 键,以及 Shift+Q。但是,永远不会检测到左/右/上/下箭头键。


将代码转换为 C++ 并调用 Win32GetAsyncKeyState()确实可以使用箭头键。


根据网络,值KeyEvent.VK_DOWN匹配Win32 定义(40)。


知道为什么 JNA 没有正确检测到箭头键吗?


catspeake
浏览 150回答 1
1回答

慕标琳琳

KeyboardUtils在任何平台上根本不支持方向键。KeyboardUtils仅适用于 3 种键盘平台 - Windows、Mac 和 Linux。在 Mac 上,isPressed()根本没有实现并为所有键代码返回 false,并在初始化UnsupportedOperationException时抛出an。KeyboardUtils在 Windows 和 Linux 上,KeyboardUtils支持以下键:VK_A - VK_ZVK_0-VK_9VK_SHIFTVK_CONTROLVK_ALTVK_META(仅限 Linux)在 Windows 上,将键码KeyboardUtils.isPressed()转换KeyEvent为 Win32 虚拟键码 (in W32KeyboardUtils.toNative()) 并将它们传递给GetAsyncKeyState()(in W32KeyboardUtils.isPressed())。但是箭头键未被处理并被转换为虚拟键码 0,这不是有效的键码。与 Linux 键码类似。因此,要检测 Windows 上的箭头键,您必须调用GetAsyncKeyState()自己,正如您已经发现的那样。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java