4

我希望发生这种情况:

  1. 启动我的java程序
  2. 我的 java 程序启动 notepad.exe
  3. 如果我在记事本中输入一个字母,我的 java 程序应该做出反应并打印出该字母

简而言之:是否可以为另一个进程创建一个关键事件侦听器?java程序不会有焦点。

如果不可能,我希望能够在我的 Java 摆动窗口和记事本进程之间改变焦点。例如:

A)我的 java 程序有焦点(小摆动窗口),我输入字母“A”
B)记事本快速获得焦点,并在那里输入字母 A(例如使用 Robot 类)
C)我的 java 程序再次获得焦点


引用为位于系统托盘中的 Java 程序创建键盘挂钩中给出的答案

所以,创建一个键盘钩子并不像看起来那么容易,java 没有提供直接的方式来与系统事件进行交互以保证安全;因为它可能会导致有关 JVM 、系统内存和 Java 框架的可移植性的严重问题。

你有 4 种方法来制作全局键盘钩子:

  1. 学习 JNI / JNA,我更喜欢 JNA,因为它比 JNI 容易得多,在这两种情况下你都需要处理 .dll 文件。
  2. 使用 JIntellitype ,正如您所说,它会产生一些问题。
  3. Sergei Biletnikov 的优雅解决方案在这里http://biletnikov-dev.blogspot.com/2009/09/global-hotkeys-for-java-applications_25.html
  4. 忽略 Java,并尝试 Autoit V3(我不是 100% 确定它,但我认为您可以将信号/事件从 Autoit 发送到您的 Java 应用程序,因此 Autoit 可以作为捕捉全局击键的桥梁)

使用数字 3,这是一个很好的教程。如果链接有 404'd 可能项目源仍然存在:gigapeta.com/dl/1917618aba749a

4

1 回答 1

2

使用您提出的解决方案#1:

学习 JNI / JNA,我更喜欢 JNA,因为它比 JNI 容易得多,在这两种情况下你都需要处理 .dll 文件。

你应该看看这个stackoverflow线程:

Windows 中的 JNA 键盘挂钩

有演示 JNA 密钥挂钩的复制/粘贴代码。您需要从http://jna.java.net/下载 JNA 依赖项才能使示例工作。您甚至不需要摆弄愚蠢的 DLL。

此外,您可能想尝试一下这个库。虽然我没有这方面的经验,但它出现在我的谷歌搜索“java 键盘挂钩”中。它似乎完成了拦截击键的目标:

http://code.google.com/p/jnativehook/

请注意,您需要一些额外的本机代码才能查看当前的“活动窗口”是什么。如果活动窗口与“Notepad.exe”匹配,那么您应该记录本机按键事件。

祝你好运!

于 2012-05-20T01:22:06.443 回答