将键盘事件从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的小型第三方库来说,这可能是一个有趣的概念。