我正在运行 Fedora 22 (Linux),并且有一个由其他人编写的 Java 应用程序,我想将击键发送到该应用程序。我尝试以各种方式使用 xdotool,但我既无法将焦点设置到 Java 应用程序,也无法向其发送击键。
该应用程序通过 javaws 使用以下命令行启动:
javaws -J-XX:MaxPermSize=512M -J-d64 -J-Xms1G -J-Xmx1G /path/to/java/file
我第一次尝试发送击键是使用以下命令:
xdotool search --name 'Window title' windowraise windowfocus --sync key H e l l o Return
但什么也没发生。 Java 窗口没有获得焦点或看到我的击键。
因此,我查找了 Java 进程的 PID,并尝试通过 PID 来识别该进程。
xdotool search --pid 1234 windowraise windowfocus --sync key H e l l o Return
相同的结果。最后,我尝试用“selectwindow”来识别窗口。
xdotool selectwindow windowraise windowfocus --sync key H e l l o Return
发出命令后,光标变成了方形。我将鼠标移动到Java窗口并单击,但这也不起作用。
为了进一步调查,我使用以下命令运行了另一个 Java 应用程序:
java -jar appname.jar
xdotool 也无法设置焦点或向该窗口发送击键。
阅读 xdotool 文档后,我知道某些程序不会接受其输入。我可以做些什么,例如向这些 Java 应用程序传递不同的命令行参数,让它们监听 xdotool 的击键?
以下是有关我正在运行的 Java 和 xdotool 版本的一些信息:
$ java -version
openjdk version "1.8.0_65-debug"
OpenJDK Runtime Environment (build 1.8.0_65-debug-b17)
OpenJDK 64-Bit Server VM (build 25.65-b01-debug, mixed mode)
$ xdotool --version
xdotool version 2.20110530.1
答案1
窗口焦点是窗口管理器的工作。我猜你正在使用一个。聚焦窗口的最佳方法是:
xdotool search --name 'Window title' windowactivate
xdotool 使用 2 种机制来发送按键事件,XTEST
将事件发送到当前焦点的扩展,以及XSendEvent()
将事件发送到给定窗口。后者生成事件合成的标志,一些应用程序认为这意味着存在安全风险,因此请忽略该事件。
但是,您仍然可以使用 xdotool 发送“真实”按键事件,但不得显式提供窗口。将焦点移至窗口后,使用
xdotool type Hello; xdotool key Return