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

时间:2020-03-06 14:58:09  来源:igfitidea点击:

我正在使用Java开发屏幕键盘。该键盘的每个可能键都有一个" JComponent"。当在按钮上检测到鼠标按下时,我想向当前关注的应用程序发送特定的键盘代码。键盘本身位于没有装饰的" JFrame"中,并设置为"始终在顶部"。

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

如何保持屏幕键盘始终处于"无焦点"状态?是否可以使用其他方法发送按键?

解决方案

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

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

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

现在,当使用机械手类时,我可以通过单击键将事件发送到任何聚焦的窗口。唯一的限制是,它似乎仅适用于属于同一虚拟机的窗口,而对其他任何系统窗口均不起作用。

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

显然,执行此操作的唯一方法是拥有一个JNI层,该层将进行从Java到本机的转换。 Java没有提供这种功能的简便方法。

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