从Java向任何应用程序发送键盘事件(屏幕键盘)

4
我正在开发一个使用Java的屏幕键盘。每个可能的按键都有一个JComponent组件。当检测到鼠标按下按钮时,我想将特定的键盘代码发送给当前聚焦的应用程序。键盘本身位于一个没有装饰并始终置顶的JFrame中。
我发现Robot类可以用于在本地队列上模拟这些键盘事件。但是,在这种情况下,选择JComponent将意味着接收到JFrame上的按键按下事件,而我将无法在其他应用程序中接收它。
如何保持我的屏幕键盘“始终无焦点”?也许可以使用另一种方法来发送按键按下事件吗?
5个回答

3
我在尝试使用实际的键盘和鼠标命令控制游戏机器人时(使其更加“人性化”),发现了jnativehook

从JNativeHook的描述来看,它似乎是用于监听键盘和鼠标事件,而不是向另一个应用程序发送事件。 - Simon Forsberg

2

显然,唯一的方法是使用JNI层进行转换。Java没有提供这样的功能。

对于想要学习JNI的人来说,这可能是一个有趣的小型第三方库的概念...


2
到目前为止,我找到的唯一解决方案是将每个键都设置为JComponent(这样它就不能获得焦点),并在JFrame上设置以下属性:
    setUndecorated(true);
    setFocusableWindowState(false);
    setFocusable(false);
    enableInputMethods(false);

现在使用机器人类时,我可以通过点击键盘将事件发送到任何聚焦的窗口。唯一的限制是它似乎只适用于属于同一虚拟机的窗口,并且在任何其他系统窗口中根本不起作用。


在Windows 10上完美运行,应该是第一选择,不需要JNI。 - Alex Jone

0

你尝试过在使用机器人类之前调用本地的setfocus()或setactivewindow()函数来移动焦点吗?


0

我不知道有没有一种与操作系统无关的方法来实现这个。我不知道Windows,但通过X协议与X服务器交流是可能的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接