使用Java(OSX)设置任何应用程序的焦点?

时间:2013-02-13 17:46:51

标签: java macos focus

如何在OSX上从Java程序设置任意应用程序(Java或非Java)的焦点(例如cmd + tab)?

在寻找这个问题的答案时,我遇到了this question,但它对OSX没有任何帮助。

编辑:一个可能性似乎是使用类似QuicksilverRobot的内容来发送带有修饰符的按键。不过,我更喜欢更便携的东西,它需要较少的设置才能在编译后进行更改....

3 个答案:

答案 0 :(得分:3)

您应该能够使用OS X附带的open命令重新激活已在运行的应用程序:

Runtime.exec("open /path/to/Whichever.app");

(或该功能的一些等效重载。)如果应用程序尚未运行,也会打开它。

答案 1 :(得分:2)

您可以使用javax.script API运行AppleScripts。所以你可以按照“告诉应用程序”WhateverApp“激活”的方式编写一个脚本,为WhateverApp填写你的任意应用程序,它应该做你想要的。

答案 2 :(得分:2)

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