在Applescript中,如何确定菜单项是否被选中/聚焦?

时间:2008-09-16 02:53:35

标签: macos focus applescript menu

我有一个OS X 10.5脚本,它将搜索框的焦点集中在任何应用程序的“帮助”菜单中。我有一个关键组合,就像Spotlight一样,我希望它在我运行脚本时切换。因此,我想检测搜索框是否已经集中用于键入,如果是,请键入Esc而不是单击“帮助”菜单。

这是现在的脚本:

tell application "System Events"
    tell (first process whose frontmost is true)
        set helpMenuItem to menu bar item "Help" of menu bar 1
        click helpMenuItem
    end tell
end tell

我正在考虑这样的事情:

tell application "System Events"
    tell (first process whose frontmost is true)
        set helpMenuItem to menu bar item "Help" of menu bar 1
        set searchBox to menu item 1 of menu of helpMenuItem
        if (searchBox's focused) = true then
            key code 53 -- type esc
        else
            click helpMenuItem
        end if
    end tell
end tell

...但是我收到了这个错误:

  

无法关注应用程序“系统事件”的应用程序“脚本编辑器”的菜单栏1的菜单栏项“帮助”的菜单“帮助”的菜单项目1。

那么我有没有办法让我的脚本检测搜索框是否已经聚焦?


我通过working around it解决了我的问题。我仍然不知道如何检查菜单项是否被选中,所以我将打开这个主题。

5 个答案:

答案 0 :(得分:4)

内置键快捷键 Cmd - ? Cmd-Shift - / )的行为就像这样。如果关键焦点尚未聚焦,它会将关键焦点移动到帮助菜单的搜索栏,否则会关闭菜单。

答案 1 :(得分:3)

您需要使用属性AXMenuItemMarkChar

示例:

tell application "System Events"
    tell process "Cisco Jabber"
        set X to (value of attribute "AXMenuItemMarkChar" of menu item "Available" of menu "Status" of menu item "Status" of menu "File" of menu bar item "File" of menu bar 1) is "✓" -- check if Status is "Availible"    
    end tell
end tell

如果选中菜单项,则返回值为,否则为missing value

注意:此测试仅适用于正在检查其菜单的应用程序当前最前面

答案 2 :(得分:2)

使用/ Developer / Applications / Utilities / Accessibility Tools / Accessibility Inspector.app,您可以使用内置辅助功能系统查看鼠标下UI元素的属性。请特别注意cmd-F7操作以将焦点锁定在元素和“刷新”按钮上。遗憾的是,元素和属性名称与脚本套件中的元素和属性名称不直接匹配,但您可以查看系统事件的字典,或者通常猜测正确的术语。

使用此功能,您可以确定两件事。首先,focused属性不在menu item上,而是text field内的menu item属于焦点。其次,菜单项具有selected属性。

有了这个,我想出了:

tell application "System Events"
    tell (first process whose frontmost is true)
        set helpMenuItem to menu bar item "Help" of menu bar 1

        -- Use reference form to avoid building intermediate object specifiers, which Accessibility apparently isn't good at resolving after the fact.
        set searchBox to a reference to menu item 1 of menu of helpMenuItem
        set searchField to a reference to text field 1 of searchBox

        if searchField's focused is true then
            key code 53 -- type esc
        else
            click helpMenuItem
        end if
    end tell
end tell

虽然这仍然不起作用。据我所知,关键事件并未触发,因此文本字段中的focused属性可能仍然存在一些问题。

无论如何,您的click再次解决方案似乎更容易。

答案 3 :(得分:1)

我只是想在Illustrator中自行完成一些文件处理。

以下是我提出的建议:

tell application "Adobe Illustrator"
activate
tell application "System Events"
    tell process "Illustrator"
        set frontmost to true
        set activeMenuItem to enabled of menu item "Unlock All" of menu "Object" of menu bar item "Object" of menu bar 1
        if activeMenuItem is true then
            tell me to beep 3
        else
            tell me to beep 2
        end if
    end tell
end tell
end tell

完成。

这没有问题,可用于迭代文件。在未来的自动化中,我可能不得不多做这件事。

祝你好运!

答案 4 :(得分:0)

这对我有用,可以使用“selected”属性在两个菜单项之间切换,基于选择的一个:

tell application "System Preferences"
    reveal anchor "keyboardTab" of pane "com.apple.preference.keyboard"
end tell
tell application "System Events" to tell process "System Preferences"
    tell pop up button 2 of tab group 1 of window 1
        click
        delay 0.2
        set appControl to menu item "App Controls" of menu 1
        set fKeys to menu item "F1, F2, etc. Keys" of menu 1
        if selected of appControl is true then
            click fKeys
        else
            click appControl
        end if
    end tell
end tell