我希望这发生:
>启动我的java程序
>我的java程序启动notepad.exe
>如果我在记事本中键入一个字母,我的java程序应该做出反应并打印出来
简而言之:是否可以为另一个进程创建一个关键事件监听器? java程序没有焦点.
如果不可能,我希望能够在我的Java swing窗口和记事本过程之间改变焦点.例如:
A)我的java程序有焦点(小摆动窗口),我输入字母“A”
B)记事本快速获得焦点并在那里输入字母A(例如使用Robot类)
C)我的java程序再次获得关注
所以,创建一个键盘钩子并不像它看起来那么容易,为了安全起见,java没有提供与系统事件交互的直接方式;因为它可能导致有关JVM,系统内存和Java Framework可移植性的严重问题.
你有4种方法来制作全局键盘钩子:
>学习JNI / JNA,我更喜欢JNA,因为它比JNI容易得多,在这两种情况下你都应该处理.dll文件.
>使用JIntellitype,正如您所说 – 发布了一些问题.
>谢尔盖比勒特尼科夫在http://biletnikov-dev.blogspot.com/2009/09/global-hotkeys-for-java-applications_25.html年的优雅解决方案
>忽略Java,尝试Autoit V3(我不是100%肯定它,但我认为你可以将信号/事件从Autoit发送到你的Java应用程序,所以Autoit只是作为捕获全局击键的桥梁)
顺其自然,这是一个很好的教程.如果该链接有404’d,那么项目源仍然可能正在运行:gigapeta.com/dl/1917618aba749a
最佳答案 使用您提供的解决方案#1:
Learn JNI / JNA, and I prefer JNA since its much easier than JNI , in both cases you shall deal with .dll files.
你应该看一下这个stackoverflow线程:
有一个复制/可管理的代码演示了JNA密钥钩子.您需要从http://jna.java.net/下载JNA依赖项才能使用该示例.你甚至不需要摆弄愚蠢的DLL.
此外,您可能想尝试使用此库.虽然我没有使用它的经验,但它在我的谷歌搜索中出现了“java keyboard hook”.它似乎完成了拦截键击的目标:
请注意,您需要一些额外的本机代码才能查看当前“活动窗口”的内容.如果活动窗口与“Notepad.exe”匹配,则应记录本机键事件.
祝好运!