【问题标题】:OS X Programmatically Click Menu Item of Dock MenuOS X 以编程方式单击 Dock 菜单的菜单项
【发布时间】:2014-10-16 18:28:05
【问题描述】:

这是我的停靠菜单:

我想以编程方式单击“显示最近的窗口”按钮。这可以使用 Cocoa 或 CoreFoundation 以编程方式完成吗?

我知道停靠项关联的 PID。

【问题讨论】:

    标签: macos cocoa macos-carbon core-foundation


    【解决方案1】:

    有很多方法可以实现这一点,尽管通常您可以轻松设置一个可以处理此问题的AppleScriptoascript。基本上它涉及使用AXRaise,它本质上调用函数来提升指定应用程序的最前面的窗口。

    代码:

    set mostrecentWindow to "mostrecentWindow"
    set theApplication to "Safari"
    tell application "System Events"
        if exists process theApplication then
            --raise frontmost window
            tell process theApplication
                set frontmost to true
                perform action "AXRaise" of (windows whose title is mostrecentWindow)
            end tell
        else if not (exists process theApplication) then
            --display alert
            display alert "Warning: process " & theApplication & " is not running"
        end if
    end tell
    

    上面的例子检查 Safari 进程是否正在运行,如果是,则将其最近(或最前面)的窗口提升到前台;否则显示进程未运行的警告。

    【讨论】:

    • 好吧,我想出了一个不启用辅助设备的方法,但我真的认为这太不可预测了,我会推荐任何人使用,尤其是对于您可能分发的任何东西;如果您有兴趣,我很乐意分享信息。
    • 因为它不需要启用辅助设备,它只使用窗口项目的内部(不是窗口)。这就是它绕过使用它的方式,尽管问题在于每个应用程序设置它的窗口不同 - 这意味着项目也不同并且经常更改。我在 Safari 中使用它没有任何问题,但在 Firefox 中发生了一些非常奇怪的事情,包括某个窗口或盒子以某种方式损坏并粘在一个位置。
    • 如果窗口被最小化并且你运行脚本,通常会发生奇怪的事情——我不确定是否有人尝试过这样的方法,这可能不是最好的做事方式,所以也许有人可以扩展它。 Here's the code.
    • AXRaise 在窗口被最小化或位于其他可能有焦点的窗口后面时很有用。此外,您可以更好地控制要控制的窗口。您发布的该示例中列出的所有脚本都需要启用辅助设备。设置窗口的标题实际上或多或少只是碰巧是任何窗口的别名。如果你知道它是什么,你可以通过它的名字专门调用一个特定的窗口。
    • 是的,有几种方法,这个比较靠谱:tell (1st window whose value of attribute "AXMain" is true) *(linebreak)* set theWindow to value of attribute "AXTitle" *(linebreak)* end tell
    【解决方案2】:

    这听起来像是可以使用GUI Scripting 使用AppleScript 来完成的任务。

    【讨论】:

    • 感谢西蒙的快速回复。我想知道是否可以不使用 AppleScript,因为我认为我不能从我的 C 代码运行 AppleScript :(
    • 嗯,有 NSAppleScript 类,但我不确定如何在 C 中使用它。
    • 很有趣,我会研究一下,但看起来它需要启用“辅助模式”:(
    • @Noitidart,启用辅助模式有什么问题?这在 OS X 上非常典型,尤其是如果您想使用许多 AppleScript。
    • 我的目标受众不能保证他们是否开启了它:(而且我不能要求他们开启它:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 2012-10-26
    • 1970-01-01
    相关资源
    最近更新 更多