为了账号安全,请及时绑定邮箱和手机立即绑定

JNA KeyboardUtils.isPressed 不能使用箭头键

JNA KeyboardUtils.isPressed 不能使用箭头键

catspeake 2023-06-08 20:08:51
我正在尝试创建一个调用 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 没有正确检测到箭头键吗?
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

KeyboardUtils在任何平台上根本不支持方向键。

KeyboardUtils仅适用于 3 种键盘平台 - Windows、Mac 和 Linux。

在 Mac 上,isPressed()根本没有实现并为所有键代码返回 false,并在初始化UnsupportedOperationException时抛出an。KeyboardUtils

在 Windows 和 Linux 上,KeyboardUtils支持以下键:

  • VK_A - VK_Z

  • VK_0-VK_9

  • VK_SHIFT

  • VK_CONTROL

  • VK_ALT

  • VK_META(仅限 Linux)

在 Windows 上,将键码KeyboardUtils.isPressed()转换KeyEvent为 Win32 虚拟键码 (in W32KeyboardUtils.toNative()) 并将它们传递给GetAsyncKeyState()(in W32KeyboardUtils.isPressed())。但是箭头键未被处理并被转换为虚拟键码 0,这不是有效的键码。

与 Linux 键码类似。

因此,要检测 Windows 上的箭头键,您必须调用GetAsyncKeyState()自己,正如您已经发现的那样。


查看完整回答
反对 回复 2023-06-08
  • 1 回答
  • 0 关注
  • 149 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信