我正在开发一个带有java的屏幕键盘。每个可能的键都有一个JComponent
。当在按钮上检测到鼠标按下时,我想将特定键盘代码发送到当前焦点上的应用程序。键盘本身在JFrame
范围内,没有任何装饰,并设置为始终在顶部。
我发现Robot类可以用来模拟本机队列上的这些键盘事件。但是,在这种情况下,选择JComponent
意味着在JFrame
上收到按键,我将无法在其他应用程序中收到
如何保持屏幕键盘“始终无焦点”?是否可以使用另一种方法发送按键?
答案 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服务器通话。