0

我正在创建一个需要自行启动听写(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 the error from the 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,果然有一个菜单栏(而且我可以看到它......)。

证明确实有菜单!

这里出了什么问题?

4

2 回答 2

1

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

运行上面的示例,我确实发现我必须将应用程序(Emacs 和用于测试 Automator)添加到辅助功能应用程序(系统偏好设置 -> 安全和隐私 -> 隐私 -> 辅助功能)。有关select-a-menu-item-in-applescript-without-using-system-events-in-10-9-maverick以及AppleScript - 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”不存在。用正确的字符串替换字符串意味着不会发生错误,但不会发生操作。

于 2015-01-31T12:59:18.163 回答
0

您是否尝试过在运行系统事件之前短暂地激活您的应用程序?您还缺少其他一些东西。以下是您在 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。

于 2013-06-09T13:56:03.713 回答