将键盘事件从java发送到任何应用程序(屏幕键盘)

时间:2008-10-01 09:55:56

标签: java events swing keyboard java-native-interface

我正在开发一个带有java的屏幕键盘。每个可能的键都有一个JComponent。当在按钮上检测到鼠标按下时,我想将特定键盘代码发送到当前焦点上的应用程序。键盘本身在JFrame范围内,没有任何装饰,并设置为始终在顶部。

我发现Robot类可以用来模拟本机队列上的这些键盘事件。但是,在这种情况下,选择JComponent意味着在JFrame上收到按键,我将无法在其他应用程序中收到

如何保持屏幕键盘“始终无焦点”?是否可以使用另一种方法发送按键?

5 个答案:

答案 0 :(得分:3)

当我试图用实际的键盘和鼠标命令控制游戏机器人时,我发现jnativehook(更像“人类”)。

答案 1 :(得分:2)

到目前为止我唯一能找到的解决方案是将每个键都设为JComponent(因此它不能有焦点),并在JFrame上设置以下属性:

    setUndecorated(true);
    setFocusableWindowState(false);
    setFocusable(false);
    enableInputMethods(false);

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

答案 2 :(得分:2)

显然,唯一的方法就是拥有一个JNI层,它将从java转换为native。 Java没有简单的方法来提供这样的功能。

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

答案 3 :(得分:0)

您是否尝试在使用机器人类之前调用​​本机setfocus()或setactivewindow()函数来移动焦点?

答案 4 :(得分:0)

我不知道以独立于操作系统的方式执行此操作的任何方法。我不了解Windows,但可以通过X协议与X服务器通话。