如何使用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
相关产品推荐
相关产品推荐

