【发布时间】:2011-09-19 14:17:58
【问题描述】:
是否可以在没有用户选择 gui 的情况下监听键和鼠标事件?我想制作一个在没有 gui 的情况下在后台运行并响应用户交互的程序,例如按下 ctrl-t。
【问题讨论】:
-
看看这篇文章有没有帮助stackoverflow.com/questions/6174119/…
标签: java swing keylistener mouselistener
是否可以在没有用户选择 gui 的情况下监听键和鼠标事件?我想制作一个在没有 gui 的情况下在后台运行并响应用户交互的程序,例如按下 ctrl-t。
【问题讨论】:
标签: java swing keylistener mouselistener
你可能想看看 jnativehook。 Jnativehook 允许您使用 JNA 侦听键盘事件,而无需现有的焦点 GUI。
https://github.com/chrislgarry/Apollo-11 https://github.com/kwhat/jnativehook/blob/2.2/doc/ConsumingEvents.md
示例用法:
try {
GlobalScreen.registerNativeHook()
} catch (NativeHookException ex) {
System.out.println(ex.message)
}
GlobalScreen.addNativeKeyListener(
new NativeKeyListener() {
@Override
public void nativeKeyTyped(NativeKeyEvent nativeEvent) {
System.out.println("Pressed " + nativeEvent.keyChar)
}
}
)
【讨论】:
窗口管理器将根据其配置跟踪焦点和直接输入。如果您的窗口管理器决定将输入发送到另一个程序,因为它正在强制更改焦点,那么您就不走运了。
虽然程序没有焦点,但如果它能够获取鼠标和键盘事件,那将是一个重大的安全漏洞。基本上任何不引人注意的小型后台程序都可以监视整个系统,甚至可能在此过程中窃取密码。
你唯一的希望是在你的窗口管理器中找到一个选项,它可以让你在不改变焦点的情况下最小化程序。当然,无论您键入什么,都只会进入最小化的程序(不会影响系统的其余部分)。
另一种技术(绝不保证)是让程序检测最小化事件,并在最小化事件处理程序中请求焦点。请注意,这样做可能会(如果我正在编写窗口管理器)取消最小化窗口。
【讨论】: