如何在 OSX 上从 Java 程序设置任意应用程序(Java 或非 Java)的焦点(例如 cmd+tab)?
在寻找这个问题的答案时,我遇到了这个问题,但这对 OSX 并没有真正的帮助。
编辑:一种可能性似乎是使用Quicksilver之类的东西,并Robot
使用修饰符向它发送按键。不过,我更喜欢更便携的东西,在编译后需要更少的设置来进行更改....
您应该能够使用open
OS X 附带的命令重新激活已经运行的应用程序:
Runtime.exec("open /path/to/Whichever.app");
(或该功能的一些等效重载。)如果尚未运行,这也会打开一个应用程序。
您可以使用 javax.script API 来运行 AppleScripts。因此,您可以按照“告诉应用程序“WhateverApp”激活”的方式编写一个脚本,为您的任意应用程序填写 WhateverApp,它应该执行您想要的操作。
Chuck 的回答提示我osascript
,所以我决定直接从命令行试一试。设法让它与Runtime.exec()
、osascript
和 AppleScript 一起工作。
Java 启动一个 AppleScript 并将应用程序名称传递给它,osascript
从命令行使用,通过Runtime.exec()
:
try {
List<String> shellCommandList = new ArrayList<String>();
shellCommandList.add("osascript");
shellCommandList.add("activateApplication.scpt");
shellCommandList.add(appName);
String[] shellCommand = (String[])shellCommandList.toArray(new String[0]);
Process p = Runtime.getRuntime().exec(shellCommand);
// if desired, pipe out the script's output
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String cmdOutStr = "";
while ((cmdOutStr = in.readLine()) != null) {
System.out.println(cmdOutStr);
}
// if desired, check the script's exit value
int exitValue = p.waitFor();
if (exitValue != 0) {
// TODO: error dialog
System.err.println("Invalid application name: "+ appName);
}
} catch (Exception e) {
e.printStackTrace();
}
AppleScript 使用运行处理程序来捕获传入的参数:
on run (arguments)
set appName to (item 1 of arguments)
tell application appName to activate
return 0
end run