亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 187 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號