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

如何用AppleScript向嵌套层级深的窗口发送按键指令?

问题描述

我多年来编写了多个AppleScript程序,用于向各类应用发送按键指令,代码通常很简单,例如给TextEdit发送Cmd+Shift+M:

tell application "TextEdit" to activate
delay 0.5
tell application "System Events" to keystroke "m" with {command down, shift down}

但针对Microsoft Teams发送静音快捷键(Cmd+Shift+M)的脚本,此前运行正常,数月前Teams更新后彻底失效。我怀疑按键未发送到正确窗口——通过Accessibility Inspector对比发现,Teams的窗口层级嵌套极深,而其他正常应用的层级相对扁平。尝试遍历嵌套组但始终无法定位目标区域,想请教是否存在可行的实现方式,或是该窗口无法通过AppleScript/System Events发送按键指令?

Accessibility Inspector检测结果(Teams静音按钮相关)

按钮核心属性
Access Key: None
Automation Type: Button
DOM Identifier: microphone-button
Enabled: True
Keyboard Focused: True
Role: AXButton
Top Level Element: Meeting with Johnson, John | Microsoft Teams (standard window) [TeamsNSWindow]

元素层级结构

Microsoft Teams (application) (NSApplication]
  Meeting with Johnson, John | Microsoft Teams (standard window) [TeamsNSWindow] 
    Meeting with Johnson, John | Microsoft Teams - Web content - Profile 2 (group) [AXPlatformNodeCocoa]
      <empty description> (group) [AXPlatformNodeCocoa]
        <empty description> (group) [AXPlatformNodeCocoa]
          <empty description> (group) [AXPlatformNodeCocoa]
            <empty description> (scroll area) [RenderWidgetHostViewCocoa]
              Meeting with Johnson, John | Microsoft Teams (HTML content) (BrowserAccessibilityCocoa]
                <empty description> (group) [BrowserAccessibilityCocoa]
                  <empty description> (group) (BrowserAccessibilityCocoa]
                    <empty description> (group) [BrowserAccessibilityCocoa]
                      <empty description> (group) (BrowserAccessibilityCocoa]
                        <empty description> (group) [BrowserAccessibilityCocoa]
                          <empty description> (group) (BrowserAccessibilityCocoa]
                            Meeting controls (toolbar) [BrowserAccessibilityCocoa]
                              <empty description> (group) (BrowserAccessibilityCocoa]
                                <empty description> (group) (BrowserAccessibilityCocoa]
                                  *Mute mic (button) [BrowserAccessibilityCocoa]
可行解决方案

方法1:直接定位静音按钮并模拟点击

既然能通过DOM标识符microphone-button锁定目标按钮,直接模拟点击比发送快捷键更可靠,不受窗口焦点影响:

tell application "Microsoft Teams" to activate
delay 0.5

tell application "System Events"
    tell application process "Microsoft Teams"
        -- 定位会议窗口(可根据实际标题调整判断条件)
        set meetingWindow to first window whose title contains "Meeting with"
        -- 找到Web内容根组
        set webContentRoot to first group of meetingWindow whose description contains "Web content"
        
        -- 递归查找带指定DOM标识符的按钮
        set muteButton to findElementByDOMId(webContentRoot, "microphone-button")
        
        if muteButton exists then
            perform action "AXPress" of muteButton
        else
            display dialog "未找到静音按钮"
        end if
    end tell
end tell

-- 递归查找元素的辅助函数
on findElementByDOMId(parentElem, targetId)
    tell application "System Events"
        -- 检查当前元素的DOM标识符
        if value of attribute "AXDOMIdentifier" of parentElem is targetId then
            return parentElem
        end if
        
        -- 遍历子元素继续查找
        repeat with childElem in children of parentElem
            set foundElem to my findElementByDOMId(childElem, targetId)
            if foundElem exists then
                return foundElem
            end if
        end repeat
        
        -- 未找到返回空值
        return missing value
    end tell
end findElementByDOMId

方法2:强制将焦点切换到Web内容区域后发送快捷键

如果坚持使用快捷键,可先将焦点定位到Teams的Web内容容器,确保按键发送到正确层级:

tell application "Microsoft Teams" to activate
delay 0.5

tell application "System Events"
    tell application process "Microsoft Teams"
        set meetingWindow to first window whose title contains "Meeting with"
        -- 定位Web内容对应的滚动区域
        set webScrollArea to first scroll area of meetingWindow
        -- 强制设置焦点
        set focus of webScrollArea to true
        delay 0.2
        -- 发送静音快捷键
        keystroke "m" with {command down, shift down}
    end tell
end tell

关键注意事项

  • 确保Microsoft Teams已在系统辅助功能中授权:系统设置 > 隐私与安全性 > 辅助功能,勾选Microsoft Teams
  • 会议窗口标题判断条件可根据实际语言调整(比如中文环境用"正在会议")
  • DOM标识符microphone-button属于Teams内部固定标识,除非大版本更新,否则不会轻易变更

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:29:58