在 Java 中侦听无焦点的输入

2022-09-01 18:34:35

我正在使用Robot类在Java中制作一个小程序。该程序接管鼠标。在调试过程中,如果它开始以一种我不想退出程序的方式开始,则很难退出程序,因为我无法在eclipse中将鼠标移动到终止按钮,并且我无法使用热键来点击它,因为鼠标在另一个窗口中不断单击,而是使该窗口获得焦点。

我想做的只是挂接一个键列表,这样当我点击q时,我可以退出程序,但我知道如何做到这一点的唯一方法是制作一个窗口,并且该窗口需要焦点来捕获输入。有没有办法从任何地方监听键盘或鼠标输入,无论什么有焦点?


答案 1

有一个库可以为您完成艰苦的工作:https://github.com/kwhat/jnativehook


答案 2

这不是一个微不足道的问题,Java并没有给你一种优雅地做到这一点的方法。您可以使用像 banjollity 这样的解决方案,但即使这样,如果您错误的鼠标点击打开了当前在任务栏中打开的另一个全尺寸窗口,即使这样也不会一直有效。

事实是,默认情况下,Java使开发人员对操作系统几乎没有控制权。这是由于2个主要原因:安全性(如java文档所引用的那样)以及不同的操作系统处理事件完全不同的事实,并且制作一个统一的模型来表示所有这些可能没有多大意义。

因此,为了回答您的问题,我想您想要的是程序的某种行为,它在全球范围内侦听按键,而不仅仅是在您的应用程序中。像这样的事情将要求您访问您选择的操作系统提供的功能,并且要在Java中访问它,您将需要通过Java本机接口(JNI)层来执行此操作。

所以你想做的是:

  1. 在C中实现一个程序,该程序将侦听操作系统上的全局按键,如果该操作系统是Windows,那么在Windows钩子上查找文档,Microsoft和MSDN在Web和其他地方都很好地记录了这些文档。如果您的操作系统是 Linux 或 Mac OS X,那么您需要使用 X11 开发库侦听全局按键。这可以在ubunutu linux发行版上根据我在 http://ubuntuforums.org/showthread.php?t=864566

  2. 通过 JNI 将 C 代码连接到 Java 代码。此步骤实际上是更简单的步骤。按照我在 http://ubuntuforums.org/showthread.php?t=864566 的教程中使用的过程在Windows和linux下进行操作,因为将C代码连接到Java代码的过程在两个操作系统上都是相同的。

要记住的重要一点是,如果您首先编写代码并调试C / C++代码并确保它正常工作,那么让JNI代码工作起来要容易得多。然后,将其与Java集成就很容易了。


推荐