【问题标题】:Java - Key catcherJava - 关键捕捉器
【发布时间】:2012-06-05 19:51:57
【问题描述】:

我正在尝试用 Java 制作一种键盘记录器。我有一个应用程序允许人们在他们的桌面上获取他们的 RSS 提要,我想快速访问。 顺便说一句,我需要一些可以做到这一点的东西:

  • 我启动我的 java jar 文件,它在系统托盘中最小化。
  • 用户做他想做的事(冲浪、看电影等)。
  • 他按下了一个组合键 (CTRL + I),然后 Java 窗口打开并显示一个 GUI,他可以在其中查看新闻和修改应用程序配置。
  • 现在他可以最小化窗口(系统托盘图标)并继续正常使用他的计算机。

我的应用必须完全跨平台。除此功能外,所有事情都已完成。 我试过用KeyStroke 甚至System.in 来做这件事,但它们只有在用户将窗口激活时才会捕捉到组合键。

那么,有没有一种方法可以在不使用 JNI 或 JNA 的情况下从应用程序外部捕获组合键(如透明覆盖)(这就是我的搜索结果)。

感谢您的帮助。

【问题讨论】:

  • 您确定您的最终用户会对捕获所有密钥的应用程序感到满意吗?我认为这是一种安全风险。
  • 这只会捕获组合的两个键。没有什么比这更多的应用真正做到这一点了。

标签: java keyboard key keylogger


【解决方案1】:

这是无法做到的。在当今世界,没有任何操作系统可以让您只记录所有击键

【讨论】:

  • ...但是有很多键盘记录器,比如 Ubuntu。你当然需要是 root。
【解决方案2】:

不,您必须使用某些系统相关库,即使用某种形式的 JNI。

不同的内置粒度级别是:

WHEN_ANCESTOR_OF_FOCUSED_COMPONENT

用于 registerKeyboardAction 的常量,表示当接收组件是焦点组件的祖先或本身是焦点组件时,应该调用命令。

WHEN_FOCUSED

用于 registerKeyboardAction 的常量,表示当组件获得焦点时应该调用该命令。

WHEN_IN_FOCUSED_WINDOW

用于 registerKeyboardAction 的常量,表示当接收组件位于具有焦点的窗口中或本身是焦点组件时,应调用该命令

【讨论】:

  • 感谢您的回答。是否可以为每个平台制作一个捕手,例如一个用于 windows 的 JNI 文件,一个用于 linux 和一个用于 mac?我的 C++ 不太好,所以有可能在 C 中实现吗?
  • 是的。 AFAIK 这将是完全可行的。
  • 这是一个针对 Linux 的项目:sourceforge.net/projects/jxgrabkey,这是一个针对 Windows 的项目:melloware.com/products/jintellitype/index.html
  • 我终于解决了为每个系统制作不同库的问题。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-09
  • 2012-09-21
  • 1970-01-01
  • 2011-01-16
  • 2014-01-01
  • 1970-01-01
相关资源
最近更新 更多