4

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

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

如何让我的屏幕键盘“始终没有焦点”?是否可以使用另一种方法来发送按键?

4

5 回答 5

3

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

于 2012-01-12T16:41:39.177 回答
2

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

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

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

于 2008-10-09T14:24:40.047 回答
2

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

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

于 2008-10-20T15:25:17.160 回答
0

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

于 2008-10-01T11:15:08.660 回答
0

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

于 2008-10-11T15:14:18.637 回答