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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 14:54:29