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

如何使用Swift在Mission Control中无需移动鼠标取消选中窗口

实现方案

基于现有Swift代码修改

你已经完成了核心的元素定位逻辑,只需要对存储选中项的AX容器元素的kAXSelectedChildrenAttribute属性写入空数组即可取消选中,不需要改动鼠标位置,修改后的代码如下:

for entry in  (CGWindowListCopyWindowInfo(CGWindowListOption.optionOnScreenOnly, kCGNullWindowID) as NSArray? as? [[String: AnyObject]])!
{
    if entry[kCGWindowOwnerName as String] as! String == "Dock"
    {
        let bounds: NSDictionary = entry[kCGWindowBounds as String] as! NSDictionary
        if (bounds["Y"] as! NSNumber) != 0{ // 判断Mission Control已启动
            let dockPID = (entry[kCGWindowOwnerPID as String] as? Int32)!
            let dockAppElement = AXUIElementCreateApplication(dockPID)
            var dockAttributeValues: AnyObject?
            var status = AXUIElementCopyAttributeValue(dockAppElement, kAXChildrenAttribute as CFString, &dockAttributeValues)
            guard status == .success, let children = dockAttributeValues as? [AXUIElement], let childrenRef = children.last else { break }
            status = AXUIElementCopyAttributeValue(childrenRef, kAXChildrenAttribute as CFString, &dockAttributeValues)
            guard status == .success, let children2 = dockAttributeValues as? [AXUIElement], let childrenRef2 = children2.first else { break }
            status = AXUIElementCopyAttributeValue(childrenRef2, kAXChildrenAttribute as CFString, &dockAttributeValues)
            guard status == .success, let children3 = dockAttributeValues as? [AXUIElement], let targetContainer = children3.first else { break }
            // 读取当前选中项
            status = AXUIElementCopyAttributeValue(targetContainer, kAXSelectedChildrenAttribute as CFString, &dockAttributeValues)
            guard status == .success, let selectedItems = dockAttributeValues as? [AXUIElement], !selectedItems.isEmpty else {
                print("no windows selected")
                break
            }
            // 新增逻辑:写入空数组取消选中
            let emptyArray = [] as CFArray
            status = AXUIElementSetAttributeValue(targetContainer, kAXSelectedChildrenAttribute as CFString, emptyArray)
            if status == .success {
                print("已取消窗口选中")
            } else {
                print("取消选中失败,错误码:\(status.rawValue)")
            }
            break
        }
    }
}

注意事项

  • 你的应用需要先在「系统设置>隐私与安全性>辅助功能」中添加并开启权限,否则AX接口的写入操作会失败
  • 代码补充了每一步AX调用的错误判断,避免Mission Control层级结构变动导致的崩溃

AppleScript 实现方案

如果需要用脚本实现,可以直接使用以下代码,无需编译:

tell application "System Events"
	tell process "Dock"
		set missionControlContainer to first group of first group of last group of UI element 1
		set value of attribute "AXSelectedChildren" of missionControlContainer to {}
	end tell
end tell

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:45:01