【问题标题】:Cocoa application contains no menu bars, according to AppleScript根据 AppleScript,Cocoa 应用程序不包含菜单栏
【发布时间】:2013-06-05 03:53:42
【问题描述】:

我正在创建一个需要自行启动听写 (OSX 10.8) 的 Mac 应用程序。因为没有办法“直接”启动听写,所以最好的方法是通过菜单栏“编辑”/“开始听写”,因为用户可能有不同的键盘快捷键。

这是我的应用调用的简单脚本(使用 NSAppleScript 对象):

tell application "System Events"
    tell application process "MyApp"
        tell menu bar 1
            tell menu bar item "Edit"
                tell menu "Edit"
                    click menu item "Start Dictation"
                end tell
            end tell
        end tell
    end tell
end tell

这是结果(NSLog'd 来自 AppleScript 的错误)

Error:-1719 System Events got an error:
Can’t get menu bar 1 of application process "MyApp". Invalid index.

我做了一个基本测试,看看发生了什么

我的应用:

tell application "System Events"
    tell application process "MyApp"
        set x to menu bars
        return x
    end tell
end tell

result: <NSAppleEventDescriptor: [ ]>

查找器:

tell application "System Events"
    tell application process "Finder"
        set x to menu bars
        return x
    end tell
end tell

result: <NSAppleEventDescriptor: [ 'obj '{ 'form':'indx', 'want':'mbar', 'seld':1, 'from':'obj '{ 'form':'name', 'want':'pcap', 'seld':'utxt'("Finder"), 'from':null() } } ]>

所以基本上 AppleScript 告诉我我的应用程序没有菜单栏?我运行 Accessibility Inspector,果然有一个菜单栏(而且我可以看到它......)。

这里出了什么问题?

【问题讨论】:

    标签: objective-c cocoa applescript osx-mountain-lion menubar


    【解决方案1】:

    您是否尝试过在运行系统事件之前短暂地激活您的应用程序?您还缺少其他一些东西。以下是您在 Safari 中的操作方式...

    tell application "Safari" to activate
    delay 1
    
    tell application "System Events"
        tell process "Safari"
            tell menu bar item "Edit" of menu bar 1
                click
                delay 0.5
                tell menu item "Speech" of menu 1
                    click
                    delay 0.5
                    click menu item "Start Speaking" of menu 1
                end tell
            end tell
    
        end tell
    end tell
    

    第二点。如果您自己创建应用程序,那么您不需要按照您的建议进行操作。你说“因为没有办法直接启动听写”,但你为什么这么说?每个菜单项都连接到一个命令,因此本质上,如果这是您自己的应用程序,您可以连接到该命令。只需在您的界面中创建一个按钮或其他东西,并将其连接到菜单项所连接的相同命令。例如,我可以在 Xcode 中看到“开始讲话”菜单项连接到 First Responder 的 startSpeaking 命令。因此,您可以自己创建一个按钮或其他一些项目并将其连接到界面构建器中的 startSpeaking of First Responder。

    【讨论】:

    • 延迟不应该影响它,原因有两个:1. 与任何其他应用程序都可以正常工作,2. 我实际上已经尝试过延迟,但无济于事。此外,据我所知,听写菜单项对应用程序不可用(它不会出现在界面构建器的编辑菜单中)。如果我错了,请纠正我。
    • 如前所述,开始和停止说话是第一响应者方法,因此无论您是否可以在“编辑”菜单中看到它们,您仍然可以将自己的控件连接到界面构建器中的这些方法,如果可以的话它在那里还有一种程序化的方式来开始和停止说话......我只是没有调查过。因此,无论如何您都可以将命令添加到您自己的应用程序中。
    【解决方案2】:

    我正在寻找类似的东西,我想从 Emacs 中激活一个服务,否则它会覆盖该服务的全局键盘快捷键 - 我将在另一个线程中提出一个不同的问题。

    运行上面的示例,我确实发现我必须将应用程序(Emacs 和用于测试 Automator)添加到辅助功能应用程序(系统偏好设置 -> 安全和隐私 -> 隐私 -> 辅助功能)。有关select-a-menu-item-in-applescript-without-using-system-events-in-10-9-maverickAppleScript - uiscripting 的更多信息。

    通过该访问权限,我可以看到服务下的菜单项:

    tell application "Emacs"
        activate
    end tell
    tell application "System Events"
        tell application process "Emacs"
            tell menu bar 1
                tell menu "Emacs"       
                    tell menu item "Services"
                        tell menu "Services"
                            set x to menu items
                            click menu item "XXX"
                            return x
                        end tell
                    end tell
                end tell
            end tell
        end tell
    end tell
    

    但是动作没有激活!

    使用上面的示例会返回“XXX”不存在的错误。将字符串替换为正确的字符串意味着不会发生错误,但不会发生操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多