我正在尝试创建一个调用 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()
自己,正如您已经发现的那样。
添加回答
举报
0/150
提交
取消