如何迅速使用CFStringGetCString?

时间:2019-04-02 17:25:15

标签: swift cfstring

我正在寻找有关的文档 CFStringGetCStringAXUIElementCopyAttributeValue

CFStringGetCString采用参数buffer: UnsafeMutablePointer<Int8>! AXUIElementCopyAttributeValue采用参数value: UnsafeMutablePointer<CFTypeRef?>

对于后者,我可以这样打:

var value: CFTypeRef?
let err = AXUIElementCopyAttributeValue(element, attribute as CFString, &value);

这满足了要求文档类型为UnsafeMutablePointer的{​​{1}}的文档。

但是我做不到相同的逻辑

CFTypeRef

我也尝试过

let buffer: Int8!
CFStringGetCString(attribute as! CFString, &buffer, 2048, CFStringBuiltInEncodings.UTF8.rawValue)

无论哪种方式,它都抱怨在初始化之前使用let buffer: Int8? CFStringGetCString(attribute as! CFString, &buffer!, 2048, CFStringBuiltInEncodings.UTF8.rawValue) ,尽管它从未在参数要求相似的工作方法中抱怨buffer

我为value看过的所有工作示例都在CFStringGetCString中使用了类似于object-c的语法。不确定正确的快速方式是什么。

我也尝试过这种方法来获得想要的值:

*

1 个答案:

答案 0 :(得分:0)

您为什么要CFStringGetCString折磨自己?如果您在Swift中有一个CFString,则可以将其转换为String并从中获取一个C字符串:

let cString: [Int8] = (cfString as String).cString(using: .utf8)!

还请注意,kAXFocusedApplicationAttribute的值不是 CFString。这是AXUIElement

这是我的游乐场测试:

import Foundation
import CoreFoundation

let axSystem = AXUIElementCreateSystemWide()
var cfValue: CFTypeRef?
AXUIElementCopyAttributeValue(axSystem, kAXFocusedApplicationAttribute as CFString, &cfValue)
if let cfValue = cfValue, CFGetTypeID(cfValue) == AXUIElementGetTypeID() {
    let axFocusedApplication = cfValue
    print(axFocusedApplication)
}

我第一次执行该操场时,出现一个系统对话框,告诉我我需要授予Xcode权限来控制我的计算机。我进入“系统偏好设置”>“安全性和隐私”>“隐私”>“可访问性”,在列表的底部找到了Xcode,然后打开了它的复选框。

这是游乐场的输出:

<AXUIElement Application 0x7fb2d60001c0> {pid=30253}

我假设您使用的是macOS,因为AXUI API仅在macOS上可用。如果只想将前端应用程序的名称作为字符串,则可以执行以下操作:

if let frontAppName = NSWorkspace.shared.frontmostApplication?.localizedName {
    print(frontAppName)
}