我正在用java开发一个屏幕键盘。该键盘具有JComponent
适用于所有可能的键。当在按钮上检测到鼠标按下时,我想将特定的键盘代码发送到当前处于焦点的应用程序。键盘本身JFrame
没有任何装饰,并设置为始终在顶部。
我发现 Robot 类可以用来模拟原生队列上的这些键盘事件。但是,在这种情况下,选择JComponent
将意味着在 上接收到按键JFrame
,而我将无法在其他应用程序中接收到它
如何让我的屏幕键盘“始终没有焦点”?是否可以使用另一种方法来发送按键?
我正在用java开发一个屏幕键盘。该键盘具有JComponent
适用于所有可能的键。当在按钮上检测到鼠标按下时,我想将特定的键盘代码发送到当前处于焦点的应用程序。键盘本身JFrame
没有任何装饰,并设置为始终在顶部。
我发现 Robot 类可以用来模拟原生队列上的这些键盘事件。但是,在这种情况下,选择JComponent
将意味着在 上接收到按键JFrame
,而我将无法在其他应用程序中接收到它
如何让我的屏幕键盘“始终没有焦点”?是否可以使用另一种方法来发送按键?
当我尝试使用实际的键盘和鼠标命令(更“像人”)来控制游戏机器人时,我发现了 jnativehook 。
到目前为止,我能找到的唯一解决方案是将每个键都设为 JComponent(因此它不能有焦点),并在 JFrame 上设置以下属性:
setUndecorated(true);
setFocusableWindowState(false);
setFocusable(false);
enableInputMethods(false);
现在,当使用机器人类时,我可以通过单击键将事件发送到任何焦点窗口。唯一的限制是,它似乎只适用于属于同一虚拟机的窗口,它根本不适用于任何其他系统窗口。
显然,做到这一点的唯一方法是拥有一个 JNI 层,它将从 java 转换为 native。Java 没有简单的方法来提供这样的功能。
对于想要学习 JNI 的人来说,这对于小型第三方库来说可能是一个有趣的概念......
在使用机器人类之前,您是否尝试过调用本机 setfocus() 或 setactivewindow() 函数来移动焦点?
我不知道以独立于操作系统的方式执行此操作的任何方式。我不了解 Windows,但可以通过 X 协议与 X 服务器通信。