我正在尝试直接向我的程序的操作系统注册全局热键。我可以将其用于所有列为JavaFX KeyCode的键,但是如果特定键的KeyCode为“未定义”,则无法将其与其他未定义键区分开,因此无法使用。
操作系统:xubuntu 18.04。
Java :版本11.0.1 2018-10-16 LTS,Oracle
JavaFX :SDK 11.0.1
一个很好的例子是许多键盘上的“媒体键”。 当我按下键盘上的媒体键时,会得到一个未定义的KeyEvent:
System.out.println(keyEvent):按键事件:KeyEvent [源= TextField @ 25181b05 [styleClass = text-input文本字段],目标= TextField @ 25181b05 [styleClass = text-输入文本字段],eventType = KEY_PRESSED,消耗= true,字符=
keyEvent.getCode():未定义
我想知道是否再次按下该键。我不需要知道密钥的名称是什么。我只需要知道下一次按下唯一键并做出反应即可。
问题是我看不到有任何方法可以区分JavaFX中KeyEvent中的UNDEFINED键。基于KeyEvent的公共API并通过查看JavaFX中KeyEvent的源代码,似乎KeyEvent不会保留任何可以唯一标识KeyCode中未定义的按键的附加信息。
更深入地研究JavaFX代码,看来方法EmbeddedScene.keyEvent
中可能存在我可能需要的唯一标识符 :
@Override
public void keyEvent(final int type, final int key, final char[] ch, final int modifiers);
该参数final int key
传递给一个KeyCodeMap.valueOf (key)
函数,在这种情况下,该函数返回KeyCode.UNDEFINED。我无法轻松测试,但我敢打赌,int
对于这些不同的媒体密钥中的每一个都有不同的值。
在JavaFX阶段,有什么方法可以监听较低级别的KeyEvent-在它们转换为KeyCode之前,我需要的信息丢失了-因此我可以捕获热键并将其注册到操作系统?
我有信心,如果我可以在代码库中获得一个在按下某个键时触发的方法,并使该键显示一个唯一的标识符,那么我可以将其余部分连接在一起。它不一定必须在JavaFX堆栈中。