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

