【发布时间】:2012-05-20 00:18:58
【问题描述】:
我希望这发生:
- 启动我的java程序
- 我的 java 程序启动 notepad.exe
- 如果我在记事本中键入一个字母,我的 java 程序应该会做出反应并打印出该字母
简而言之:是否可以为另一个进程创建一个关键事件侦听器? java 程序不会有焦点。
如果不可能,我希望能够在我的 Java 摆动窗口和记事本进程之间切换焦点。例如:
A) 我的 java 程序有焦点(小摆动窗口),我输入字母“A”
B) 记事本快速获得焦点并在此处输入字母 A(例如使用 Robot 类)
C) 我的 java 程序再次获得焦点
引用Creating a keyboard hook for a Java program that sits in the System Tray中给出的答案
所以,创建键盘钩子并不像看起来那么容易,出于安全考虑,java 没有提供与系统事件交互的直接方法;因为这可能会导致严重的JVM、系统内存和Java框架的可移植性问题..
你有 4 种方法来制作全局键盘钩子:
- 学习 JNI / JNA,我更喜欢 JNA,因为它比 JNI 容易得多,在这两种情况下您都需要处理 .dll 文件。
- 使用 JIntellitype ,正如您所说的那样,会产生一些问题。
- Sergei Biletnikov 的优雅解决方案http://biletnikov-dev.blogspot.com/2009/09/global-hotkeys-for-java-applications_25.html
- 忽略 Java,并尝试 Autoit V3(我不确定 100%,但我认为您可以将信号/事件从 Autoit 发送到您的 Java 应用程序,因此 Autoit 可以作为捕获全局键的桥梁笔画)
使用数字 3,这是一个很好的教程。如果链接有 404 可能项目源仍然存在:gigapeta.com/dl/1917618aba749a
【问题讨论】:
-
另外:只需要在 Windows 上工作。如果我需要做一些原生的东西,请告诉我如何
-
但是,您仍然可以匿名...例如,我现在是匿名的。你对我是谁一无所知。
-
您尝试做的事情违背了 Java 的安全模型。这是不可能的。
-
Vipar:你是 vipar,我可以准确地跟踪你在 stackoverflow 上所做的事情。你似乎没有掌握匿名的概念。我不知道你是谁 IRL,但你确实有身份。
-
Jivings:有一些方法可以绕过它,即使我必须使用一些 JNI 代码(我以前从未使用过)。世界上有人知道怎么做,我只需要幸运地找到他。
标签: java process keylistener keyevent awtrobot