Swift4:`AXUIElementCopyAttributeValue()`返回`AXError.cannotComplete`

问题描述 投票:0回答:1

运行以下代码:

let pid = getAppPid()
let AXApp = AXUIElementCreateApplication(pid)

var children: CFTypeRef?
let returnVal = AXUIElementCopyAttributeValue(AXApp,
    kAXChildrenAttribute as CFString, &children)
  • AXApp
    创建成功

但是

  • children
    nil
  • returnVal
    AXError.cannotComplete
    “发生了根本错误,例如在处理过程中分配内存失败。”

我在堆栈溢出和其他地方看到过使用与我完全相同的方法的代码。

我错过了什么。

我在 MacOS High Sierra 上使用 Xcode 9/Swift 4。

编辑:

我应该补充一点,Xcode 具有辅助功能权限,并且我能够成功执行其他需要辅助功能权限的操作,例如

CGEvent.tapCreate()
来监视全局键盘事件等。

swift macos cocoa accessibility swift4
1个回答
0
投票

要修复此错误,您应该通过执行以下操作来关闭

App Sandbox

您可以通过从“签名和功能”选项卡中删除沙盒来关闭它:

enter image description here

此后

AXError.cannotComplete
不应再出现。如果您仍然遇到一些问题,您可以尝试获取最前面应用程序的选定文本,如下所示:

import ApplicationServices
import Cocoa

func getSelectedText() -> String? {
    let systemWideElement = AXUIElementCreateSystemWide()

    var selectedTextValue: AnyObject?
    let errorCode = AXUIElementCopyAttributeValue(systemWideElement, kAXFocusedUIElementAttribute as CFString, &selectedTextValue)
    
    if errorCode == .success {
        let selectedTextElement = selectedTextValue as! AXUIElement
        var selectedText: AnyObject?
        let textErrorCode = AXUIElementCopyAttributeValue(selectedTextElement, kAXSelectedTextAttribute as CFString, &selectedText)
        
        if textErrorCode == .success, let selectedTextString = selectedText as? String {
            return selectedTextString
        } else {
            return nil
        }
    } else {
        print(errorCode.rawValue)
        return nil
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.