Java中的事件监听器没有应用程序有焦点? (全局按键检测)

Posted

技术标签:

【中文标题】Java中的事件监听器没有应用程序有焦点? (全局按键检测)【英文标题】:Event listener in Java without app having focus? (Global keypress detection) 【发布时间】:2010-10-22 11:50:18 【问题描述】:

我已经搜索了一段时间,似乎每个人都认为仅使用 Java 是不可能的,所以我会试一试;)

有什么方法可以让我的 Java 应用程序在另一个不相关的应用程序具有窗口焦点时监听事件(特别是关键事件)?在我的情况下,我希望检测用户何时按下键盘上的“暂停”键,即使我的 Java 应用程序没有焦点。

我听说有些人提到唯一的方法是编写一些 C 代码并使用 JNI。只是好奇是否有人知道避免这种情况的方法?或者,如果没有,至少是一个关于 c/JNI 东西的非常好的教程?

谢谢

【问题讨论】:

【参考方案1】:

这是我找到的最佳答案:

" 有一个库来处理本机键盘和鼠标控制: https://github.com/kwhat/jnativehook) "

【讨论】:

但是找不到 Maven :( 它在 com.1stleg jnativehook on maven 下。【参考方案2】:

我也不知道有什么方法可以解决这个问题。我确实找到了this link on Java's forums,其中有一个很好的例子,说明了如何设置 JNI 东西并制作一个全局键盘处理程序(这里添加的太多了)。它有点过时(2005 年),但该示例看起来足够全面,可以让您入门。

【讨论】:

【参考方案3】:

据我了解,这是无法做到的。从根本上讲,JVM 只为它接收到的 O/S 事件生成事件,并且它只有在获得焦点时才接收 O/S 输入事件。

我相信您可以使用 JNI 来触发 O/S 为所有输入生成事件,但这将非常依赖于 O/S。

【讨论】:

+1。如果有一种方法可以在没有 JNI 或 JVM 之外的其他访问的情况下执行此操作,我会感到非常惊讶。 您可以使用 com.melloware.jintellitype 包中的类。比你可以一直捕捉关键输入。但是你需要为原生函数添加一些 .dll 文件。

以上是关于Java中的事件监听器没有应用程序有焦点? (全局按键检测)的主要内容,如果未能解决你的问题,请参考以下文章

vue键盘事件不生效

Java Swing如何让JFrame获得焦点

在 Java 中没有焦点的情况下监听输入

android单例中的监听如何回调

在焦点侦听器中更改复合可绘制时,EditText会无限地触发焦点更改事件

JAVA中如何全局监听鼠标事件