You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用AppleScript查找应用菜单栏中禁用的菜单项

AppleScript识别菜单栏禁用菜单项方法

原有代码失效原因

  • 判断逻辑写反:原注释代码中if thisItem is not enabled then的逻辑是收集禁用的菜单项,和筛选启用项的需求完全相反
  • 返回值错误:即使运行注释内的筛选逻辑,函数最终return的还是全量菜单项名称列表,筛选收集的enabledItems根本没有被返回
  • 空值未过滤:菜单栏分隔符项的name属性固定为missing value,没有提前过滤就会把空值带入结果列表
  • 批量取属性的问题:直接用name of every menu item批量取值时,不会同步校验每个项的enabled属性,无法实现筛选

修正后代码

set appName to "Script Editor"
set topLevelMenus to {}
set allValidMenuItems to {}
set onlyEnabledMenuItems to {}
set onlyDisabledMenuItems to {}

-- 获取目标应用菜单栏的所有顶级菜单
tell application "System Events" to tell process appName
    set topLevelMenus to every menu of menu bar 1
end tell

-- 遍历所有顶级菜单提取菜单项
repeat with targetMenu in topLevelMenus
    set filterResult to getMenuItems(targetMenu)
    set end of allValidMenuItems to filterResult's allItems
    set end of onlyEnabledMenuItems to filterResult's enabledItems
    set end of onlyDisabledMenuItems to filterResult's disabledItems
end repeat

-- 菜单项过滤函数
on getMenuItems(targetMenu)
    tell application "System Events"
        set rawMenuItems to every menu item of targetMenu
        set validAll to {}
        set validEnabled to {}
        set validDisabled to {}
        
        repeat with singleItem in rawMenuItems
            -- 过滤分隔符/空值项
            if name of singleItem is not missing value then
                set itemName to name of singleItem
                set end of validAll to itemName
                -- 按enabled属性判断状态:true为启用,false为禁用
                if enabled of singleItem is true then
                    set end of validEnabled to itemName
                else
                    set end of validDisabled to itemName
                end if

                -- 如需遍历子菜单项,解开下方注释即可
                (*
                if exists menu of singleItem then
                    set subFilterResult to getMenuItems(menu of singleItem)
                    set validAll to validAll & subFilterResult's allItems
                    set validEnabled to validEnabled & subFilterResult's enabledItems
                    set validDisabled to validDisabled & subFilterResult's disabledItems
                end if
                *)
            end if
        end repeat

        return {allItems:validAll, enabledItems:validEnabled, disabledItems:validDisabled}
    end tell
end getMenuItems

-- 测试:读取Edit菜单(第4个顶级菜单)的可用菜单项
item 4 of onlyEnabledMenuItems

关键属性说明

  • 直接读取菜单项对象的enabled属性即可识别状态:值为true是可点击的启用状态,值为false是灰化的禁用状态
  • 分隔符项无有效name属性,通过判断name is not missing value即可完全过滤,不会再出现空值
  • 如需获取多级嵌套的子菜单项,启用代码内的递归逻辑即可自动遍历所有层级的菜单

内容的提问来源于stack exchange,提问作者se_puede_dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 19:51:20