运行以下代码:
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()
来监视全局键盘事件等。
要修复此错误,您应该通过执行以下操作来关闭
App Sandbox
:
您可以通过从“签名和功能”选项卡中删除沙盒来关闭它:
此后
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
}
}