【发布时间】:2018-02-23 15:29:37
【问题描述】:
是否可以使用 javafx 方法 .setOnKeyPressed() 来实现 jnativehook ?
例如,这是在应用程序获得焦点时监听按键的方式:
ListView<String> list = new ListView<String>();
list.setOnKeyPressed(new EventHandler<KeyEvent>() {
@override
public void handle(KeyEvent event){
if (event.getCode() == KeyCode.U) {
//Go Up list..
}
event.consume();
}
});
但我希望它在焦点位于另一个应用程序时听全局按键,所以理想情况下我希望它看起来像这样:
list.setOnKeyPressed(new EventHandler<NativeKeyEvent>() {
@override
public void handle(NativeKeyEvent event){
if (event.getKeyCode() == NativeKeyEvent.VC_U) {
//Go Up list..
}
event.consume();
}
});
但是第一行标记了错误:
1. The method setOnKeyPressed(EventHandler <? super KeyEvent>) in the type Node is not applicable for the arguments (new EventHandler<NativeKeyEvent>(){})
2. Bound mismatch: The type NativeKeyEvent is not a valid substitute for the bounded parameter <T extends Event> of the type EventHandler<T>
我确定我需要重载该方法以考虑这些参数,但是我不知道如何去做以及如何处理第二个错误。
对于 jnativehook,方法 .consume() 也是 unsupported。
或者有没有其他方法可以在javafx中上下一个listview而不使用这些方法并且兼容jnativehook?
【问题讨论】:
-
您为什么要这样做?想象一下,您的用户正在使用您的应用程序,并收到一封需要立即回复的电子邮件。您是否真的希望您的应用能够响应他们在输入电子邮件时(例如)进行的任意按键操作?
-
它不是真正为用户准备的,我需要它用于一个研究项目,我运行一个模拟器和这个应用程序并排运行,所以我需要在用户启动时由这个应用程序注册按键列出列表并进行选择。所以我只需要注册 3 个键,一个让它在列表中上升的键,另一个使它在列表中下降的键和另一个进行选择。
-
有Robot,还有java.awt关键事件。从其他应用程序窃取按键将是一个严重的安全漏洞。像 Selenium 这样的东西可以进行远程控制。所以你要么必须封装模拟器,这就是当它是一个java应用程序时比较容易。
-
实验将在受控环境中进行,其中只有两个应用程序将运行,模拟器和此自定义应用程序。无论我决定使用什么键来遍历列表,我都会确保它们在模拟器中被绑定以不做任何事情。我不太明白你所说的“窃取”密钥是什么意思,把它想象成同时使用两个应用程序的输入。
标签: java javafx java-native-interface overloading keyboard-events