Accessibility API中kAXFocusedUIElementAttribute始终返回nil的问题求助
Accessibility API中kAXFocusedUIElementAttribute始终返回nil的问题求助
大家好,我最近在开发一个无障碍工具类App,核心需求是捕获任意屏幕上选中的文本。我尝试用Accessibility API里的kAXFocusedUIElementAttribute来获取当前聚焦的UI元素,但不管怎么测试,这个属性始终返回nil,卡了好几天了,想请社区的大佬们帮忙看看问题出在哪🥺
先给大家看我的代码实现,核心逻辑都在AccessibilityManager类里:
import Foundation import AppKit import SwiftUI class AccessibilityManager: ObservableObject { private var eventMonitor: Any? init() { checkAccessibility() } private func captureTextUnderCursor() { let systemWideElement = AXUIElementCreateSystemWide() print("systemWideElement: \(String(describing: systemWideElement))") var focusedElement: AnyObject? AXUIElementCopyAttributeValue(systemWideElement, kAXFocusedUIElementAttribute as CFString, &focusedElement) print("focusedElement: \(String(describing: focusedElement))") } func setupGlobalShortcut() { // 移除已有的监听(如果存在) if let monitor = eventMonitor { NSEvent.removeMonitor(monitor) eventMonitor = nil } // 注册全局快捷键(Control + J) eventMonitor = NSEvent.addGlobalMonitorForEvents(matching: .keyDown) { [weak self] event in if event.modifierFlags.contains(.control) && event.keyCode == 38 { // 38对应键盘上的'J' self?.captureTextUnderCursor() } } } func checkAccessibility() { // ... 这里是检查无障碍权限的逻辑,我已经确认系统设置里已经给App开了无障碍权限 } deinit { if let monitor = eventMonitor { NSEvent.removeMonitor(monitor) } } }
每次按下Control+J触发captureTextUnderCursor()方法时,控制台的输出是这样的:
systemWideElement: <AXUIElement System Wide 0x600002acc4b0> focusedElement: nil
我自己已经排查了一些点:
- 系统设置里的无障碍权限确实已经开启,
checkAccessibility()方法也验证过权限状态是正常的 - 测试过在多个App(Safari、备忘录、终端)里触发快捷键,结果都是返回nil
- 系统级的AXUIElement能正常创建,但就是拿不到聚焦元素
想请教大家几个问题:
- 是不是我调用Accessibility API的方式有遗漏的地方?
- 除了系统设置里的无障碍权限,还有没有其他需要配置的权限或者Entitlements?
- 会不会是全局快捷键触发的时机问题,导致当前聚焦元素的状态没被正确捕获?
麻烦大家帮忙分析下,感激不尽!
内容来源于stack exchange
相关产品推荐
相关产品推荐

