我正在嘗試創建一個調用 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
提交
取消