从Java中的单独进程捕获键击

时间:2012-05-20 00:18:58

标签: java process keylistener keyevent awtrobot

我希望这种情况发生:

  1. 启动我的java程序
  2. 我的java程序启动notepad.exe
  3. 如果我在记事本中输入一个字母,我的java程序应该做出反应并打印出来信
  4. 简而言之:是否可以为另一个进程创建一个关键事件监听器? java程序没有焦点。

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

    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 Framework可移植性的严重问题。

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

    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只是作为捕获全局密钥的桥梁冲程)
    5. 使用数字3,这是一个很好的教程。如果链接有404'd,那么项目源可能仍在运行:gigapeta.com/dl/1917618aba749a

1 个答案:

答案 0 :(得分:2)

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

  

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

你应该看看这个stackoverflow线程:

JNA Keyboard Hook in Windows

有一个演示JNA密钥钩子的copy / pastable代码。您需要从http://jna.java.net/下载JNA依赖项才能使示例正常工作。你甚至不需要摆弄愚蠢的DLL。

此外,您可能想尝试使用此库。虽然我没有使用它的经验,但它在我的谷歌搜索中出现了“java keyboard hook”。它似乎完成了拦截键击的目标:

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

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

祝你好运!