【问题标题】:Capture key stroke from separate process in Java从Java中的单独进程捕获击键
【发布时间】:2012-05-20 00:18:58
【问题描述】:

我希望这发生:

  1. 启动我的java程序
  2. 我的 java 程序启动 notepad.exe
  3. 如果我在记事本中键入一个字母,我的 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 种方法来制作全局键盘钩子:

  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 可能项目源仍然存在:gigapeta.com/dl/1917618aba749a

【问题讨论】:

  • 另外:只需要在 Windows 上工作。如果我需要做一些原生的东西,请告诉我如何
  • 但是,您仍然可以匿名...例如,我现在是匿名的。你对我是谁一无所知。
  • 您尝试做的事情违背了 Java 的安全模型。这是不可能的。
  • Vipar:你是 vipar,我可以准确地跟踪你在 stackoverflow 上所做的事情。你似乎没有掌握匿名的概念。我不知道你是谁 IRL,但你确实有身份。
  • Jivings:有一些方法可以绕过它,即使我必须使用一些 JNI 代码(我以前从未使用过)。世界上有人知道怎么做,我只需要幸运地找到他。

标签: java process keylistener keyevent awtrobot


【解决方案1】:

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

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

你应该看看这个stackoverflow线程:

JNA Keyboard Hook in Windows

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

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

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

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

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多