天道酬勤,学无止境

如何在 Swift 中从 CFTypeRef 转换为 AXUIElement(how to cast from CFTypeRef to AXUIElement in Swift)

问题

此代码产生预期的调试输出type = AXUIElement ,但转储堆栈并说动态转换在转换的实际点失败:

func mainWindow() {
    var ptr: Unmanaged<AnyObject>?
    let kAXMainWindow: CFString! = "AXMainWindow" as NSString
    let appRef: AXUIElement! = AXUIElementCreateApplication(self.pid()).takeRetainedValue()

    let err = AXUIElementCopyAttributeValue(appRef, kAXMainWindow, &ptr)
    if err == AXError(kAXErrorSuccess) {
        let val: AnyObject? = ptr?.takeRetainedValue()
        if val != nil {
            let value: AnyObject = val!
            let description = CFCopyTypeIDDescription(CFGetTypeID(value))
            println("type = \(description)")
            let element = value as AXUIElement
        }
        else {
            println("got nil result")
        }
    }
}

完成这项工作的正确方法是什么?

回答1

此代码从 XCode 6.1 和 Swift 1.1 开始工作。

然而,现在已经 3 年过去了,Swift 变得更好了。 尽管如此,当您搜索如何使用 Swift 的 Accessibility API 时,这仍然是一个最佳结果。 所以我回来用我知道的当前最简单的方式更新:

func AXUIWindowArray(processIdentifier pid:pid_t) -> [AXUIElement] {
    var result = [AXUIElement]()
    var windowList: AnyObject? = nil // [AXUIElement]

    let appRef = AXUIElementCreateApplication(pid)
    if AXUIElementCopyAttributeValue(appRef, "AXWindows" as CFString, &windowList) == .success {
        result = windowList as! [AXUIElement]
    }
    return result
}
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • how to cast from CFTypeRef to AXUIElement in Swift
    This code produces the expected debugging output type = AXUIElement, but dumps stack and says the dynamic cast failed at the actual point of the cast: func mainWindow() { var ptr: Unmanaged<AnyObject>? let kAXMainWindow: CFString! = "AXMainWindow" as NSString let appRef: AXUIElement! = AXUIElementCreateApplication(self.pid()).takeRetainedValue() let err = AXUIElementCopyAttributeValue(appRef, kAXMainWindow, &ptr) if err == AXError(kAXErrorSuccess) { let val: AnyObject? = ptr?.takeRetainedValue() if val != nil { let value: AnyObject = val! let description = CFCopyTypeIDDescription(CFGetTypeID
  • 在 Swift3 中使用 AXUIElementCopyAttributeValue 函数获取 UI 元素的属性?(Getting Attributes for UI Elements Using AXUIElementCopyAttributeValue Function in Swift3?)
    问题 我正在尝试使用以下函数获取窗口内每个 ui 元素的标题。 func AXUIElementCopyAttributeValue(_ element: AXUIElement, _ attribute: CFString, _ value: UnsafeMutablePointer<CFTypeRef?>) -> AXError 但是,用于获取 AXTitle 的函数 AXUIElementCopyAttributeValue 返回错误。 在swift3中获取UI元素属性值的正确方法是什么? 这是我的代码。 var children:CFTypeRef? var error = AXUIElementCopyAttributeValue((windows?[0])!, "AXChildren" as CFString, &children) if error == .success, let elements = children as? [AXUIElement] { for element in elements { var cfName:CFTypeRef? error = AXUIElementCopyAttributeValue((element), "AXTitle" as CFString, &cfName) if error == .success { let
  • Getting Attributes for UI Elements Using AXUIElementCopyAttributeValue Function in Swift3?
    I'm trying to get the title of each ui element inside a window using the following function. func AXUIElementCopyAttributeValue(_ element: AXUIElement, _ attribute: CFString, _ value: UnsafeMutablePointer<CFTypeRef?>) -> AXError However, the function AXUIElementCopyAttributeValue to get AXTitle returns an error. What's the right way to get the values for attributes of UI Elements in swift3? Here's my code. var children:CFTypeRef? var error = AXUIElementCopyAttributeValue((windows?[0])!, "AXChildren" as CFString, &children) if error == .success, let elements = children as? [AXUIElement] { for
  • 快速设置屏幕上所有窗口的大小和位置(set the size and position of all windows on the screen in swift)
    问题 是否可以快速获取所有带有前台窗口的应用程序的列表,然后设置这些窗口的大小和位置。 我得到了这样的 Windows 属性列表 let type = CGWindowListOption.optionOnScreenOnly let windowList = CGWindowListCopyWindowInfo(type, kCGNullWindowID) as NSArray? as? [[String: AnyObject]] for entry in windowList! { var owner = entry[kCGWindowOwnerName as String] as! String var bounds = entry[kCGWindowBounds as String] as? [String: Int] var pid = entry[kCGWindowOwnerPID as String] as? Int32 print ("\(owner) \(bounds) \(pid) ") if owner == "Erinnerungen" { bounds!["X"] = 0 bounds!["Y"] = 0 print("reset bounds") let appRef = AXUIElementCreateApplication(pid!); /
  • 将CFString转换为NSString-Swift(Convert CFString to NSString - Swift)
    问题 我正在尝试编写一个程序,该程序将扫描可用的串行端口并将其显示在弹出菜单中。 为什么不能直接从IORegistryEntryCreateCFProperty()函数中获取CFString并通过下一行的字符串插值将其添加到菜单中? 由于某种原因,我的变量声明遇到错误: “ NSString不是CFString的子类型”。 import Foundation import Cocoa import IOKit import IOKit.serial @objc class Serial { init() { } @IBOutlet var serialListPullDown : NSPopUpButton! func refreshSerialList(defaultprompt: String) { let masterPort: mach_port_t = kIOMasterPortDefault let classesToMatch: CFDictionary = IOServiceMatching(kIOSerialBSDServiceValue).takeUnretainedValue() var matchingServices: io_iterator_t = 0 // remove everything from the pull down list
  • 不安全的可变指针在斯威夫特 3(UnsafeMutablePointer<CFTypeRef> in Swift 3)
    问题 我试图在我的钥匙串实用程序类中调用SecItemCopyMatching以从钥匙串中获取数据,但我在获取result参数UnsafeMutablePointer<CFTypeRef?>遇到了问题。 最初的声明(在 Swift 2 中,在迁移到 Swift 3 之前)是 // query is a dictionary of [String : AnyObject] var result: Data? let status = withUnsafeMutablePointer(to: &result) { SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0)) } 但是在 Swift 3 中,您现在需要调用.withMemoryRebound才能查看内存。 根据 Xcode 告诉您的操作,我尝试了此操作 var result: Data? let status = withUnsafeMutablePointer(to: &result){ $0.withMemoryRebound(to: Data.self, capacity: 1){ SecItemCopyMatching(query as CFDictionary, UnsafePointer($0)) } } 然而这样做,我得到一个错误
  • 无法从 Swift 字典中检索 CGColor(Trouble retrieving a CGColor from a Swift dictionary)
    问题 我需要一个可以存储任何类型对象的 Swift 字典。 一些值将是CGColor引用。 我在创建字典和存储CGColor引用时没有问题。 问题是试图安全地让他们回来。 let color = CGColor(gray: 0.5, alpha: 1) var things = [String:Any]() things["color"] = color things["date"] = Date() print(things) 那行得通,我得到了合理的输出。 后来我希望得到颜色(字典中可能存在也可能不存在。所以我很自然地尝试以下操作: if let color = things["color"] as? CGColor { print(color) } 但这会导致错误: 错误:有条件地向下转换为 CoreFoundation 类型“CGColor”将始终成功 最后我想出了: if let val = things["color"] { if val is CGColor { let color = val as! CGColor print(color) } } 这在操场上没有任何警告,但在我的实际 Xcode 项目中,我在if val is CGColor行上收到警告: 'is' 测试总是正确的,因为 'CGColor' 是一个 Core Foundation 类型
  • 使用Accessibility API在Mac OS X上移动其他窗口(Move other windows on Mac OS X using Accessibility API)
    问题 我正在尝试使用Accessibility API来更改其他应用程序窗口的位置。我希望做的是从所有应用程序中获取屏幕上的所有窗口,然后将它们全部移至给定的偏移量(比如说5或10)或任何值)。 我很难做到这一点,因为这对我来说是Objective-C编程的第一天。 这是我现在正在做的事情。 首先,我使用CGWindowListCopyWindowInfo查找窗口及其PID的列表。 然后,对于每个窗口,我使用AXUIElementCreateApplication来获取窗口的AXUIElementRef 。 之后,我应该将AXUIElementCopyAttributeValue与属性kAXPositionAttribute (我无法获得正确的位置,总是得到零)。 最后,我应该在位置上添加所需的偏移量,并将AXUIElementSetAttributeValue与属性kAXPositionAttribute和新的位置点一起使用(即使我将绝对值设置为0,0,也会出现运行时错误)。 当我尝试了许多没有运气的事情时,有人可以帮我做上面介绍的内容吗? 另外,它不必完全像我决定在上面实现它一样。 如果有更好的方法可以做到这一点,那么我很乐意对其进行更改。 更新:根据注释中的请求,以下是其中一种尝试的代码段: // Get all the windows CFArrayRef
  • Uniquely identify active window on OS X
    I’m trying to patch an application that resizes windows using the accessibility API. I need to maintain a dictionary with the previous sizes of windows. The key needs to identify the currently active window. At the moment, this active window is retrieved via NSAccessibilityFocusedWindowAttribute upon the press of a hotkey. However, every time this method is called, the returned AXUIElementRef which identifies the window is different! This of course means that I cannot use it as a dictionary key – the dictionary won’t find the corresponding entry. The following code reproduces the problem: -
  • Obj-C AXObserverCallback 可以转换为 Swift 吗?(Can an Obj-C AXObserverCallback be converted to Swift?)
    问题 AXObserverCallback 可以转换为 Swift 吗? 我遇到的问题似乎与 void* 有关,我知道它在 Swift 中不是有效类型。 我正在尝试将 Obj-C 代码转换为 Swift,但无法编译代码。 我不确定 AXObserverCallback 是否可以转换。 Objective-C 声明是: typedef void (*AXObserverCallback)( AXObserverRef observer, AXUIElementRef element, CFStringRef notification, void *refcon); AXObserverCallback 没有 Swift 声明。 另一个用于设置 AXObserver 的相关函数是 AXObserverCreate,其中有 Obj-C 和 Swift 的声明。 工作 Obj-C 代码的简化版本是: - (AXError)installWindowCreatedAXObserver { pid_t pid = 0; AXObserverRef observer = NULL; AXError axErr = AXObserverCreate(pid, windowCreatedCallback, &observer); return axErr; } void
  • 根据 kCGWindowName 值关闭窗口(close window based on kCGWindowName value)
    问题 但我对编程并不陌生。 我试图让一个始终运行的菜单栏应用程序侦听要打开的应用程序中的特定窗口,然后关闭该窗口,而不是该应用程序。 这是我目前的方法,它主要是我发现的其他 SO 答案的混合。 func applicationDidFinishLaunching(aNotification: NSNotification) { // listener for when user switches applications NSWorkspace.sharedWorkspace().notificationCenter.addObserver(self, selector: #selector(activated), name: NSWorkspaceDidActivateApplicationNotification, object: nil) } func activated(notification: NSNotification) { // i feel like i should be using that NSNotification but I'm not let options = CGWindowListOption(arrayLiteral: CGWindowListOption.ExcludeDesktopElements, CGWindowListOption
  • 如何在Swift中从Base64编码的字符串创建图像? [复制](How do I create an image from a Base64-encoded string in Swift? [duplicate])
    问题 这个问题已经在这里有了答案: 在UIImage和Base64字符串之间转换(24个答案) 5年前关闭。 Web服务将Base64编码的图像作为字符串回显。 如何在Swift项目中解码并显示此编码图像? 具体来说,我想获取一个图像,该图像已经由Web服务提供为Base64格式的字符串,并了解如何在UIImageView中显示它。 到目前为止,我发现的文章描述了不推荐使用的技术,或者用我不熟悉的Objective-C编写。 如何接收Base64编码的字符串并将其转换为UIImage? 回答1 通过执行以下操作,将base64编码的字符串转换为NSData实例: let encodedImageData = ... get string from your web service ... let imageData = NSData(base64EncodedString: encodedImageData options: .allZeros) 然后将imageData变成UIImage: let image = UIImage(data: imageData) 然后,您可以在UIImageView上设置图像,例如: imageView.image = image 回答2 要将Base64编码的字符串解码为图像,可以在Swift中使用以下代码: let decodedData =
  • 如何在 Swift 中从 JSON 中获取密钥?(How to fetch the key from JSON in Swift?)
    问题 我正在 Swift 中进行 JSON 解析。 var results = [String:[AnyObject]]() 上面的results是有如下所示的数据, "fruit" = ( "apple", "orange" ); 在这里,数据是在运行时动态添加的。 我所需要的只是获取密钥并将它们显示在表视图中作为标题。 如何快速从results中获取key ? 回答1 NSJSONSerialization 代码示例... var results = [String:[AnyObject]]() let jsonResult = try NSJSONSerialization.JSONObjectWithData(results, options:NSJSONReadingOptions.MutableContainers); for (key, value) in jsonResult { print("key \(key) value2 \(value)") } 回答2 您可以将 JSON 转换为字典,如 Birendra 提出的上述链接中所述。 然后假设 jsonDict 是你的 json 解析字典。 然后你可以使用jsonDict.keys获取所有键的jsonDict.keys 。 回答3 您需要使用NSJSONSerialization类转换为 json 格式
  • 如何在MySQL中从varbinary转换为char / varchar(How to convert from varbinary to char/varchar in mysql)
    问题 我有一个是varbinary的字段。 它已经被填充。 现在如何将varbinary转换为varchar,以便可以将字段中的数据用于其他目的。 我使用的是MySQL版本5.10 回答1 迟到的答案... 您可以这样使用CAST或CONVERT CAST(foo AS CHAR(100)) CONVERT(foo, CHAR(100)) 支持的类型(5.5)是: BINARY[(N)] CHAR[(N)] DATE DATETIME DECIMAL[(M[,D])] SIGNED [INTEGER] TIME UNSIGNED [INTEGER] 您不能直接转换为varchar。 2008年有一个开放的MySQL错误,似乎没人在乎,该死的烦人 回答2 在与此类似的情况下对我有用的MySQL语法是: select cast(binaryColumn as CHAR) from table_name 回答3 您可以使用强制转换操作: select cast(column_name as char) from table_name
  • 如何在 mysql 中从 cast varchar 中选择 min 到 int(HOW select min from cast varchar to int in mysql)
    问题 如何在mysql中将varchar转换为double值 看,我在 varchar 中有表格列,但它只有数字。 在那我想选择该值的最小最大值。 请检查以下查询,其中出现语法错误。 select MAX(CAST(ch1 as INT)) as max_ch1, MIN(CAST(ch1 as INT)) as min_ch1 from t9; 请参考下面的sqlfiddle 回答1 我认为这就是你要找的: SELECT MIN(CAST(CH1 AS SIGNED)), MAX(CAST(CH1 AS SIGNED)) FROM t9 在这里工作 SQLFiddle。 您必须将值转换为SIGNED ,这对应于 MySQL 中的INTEGER 。 有关此的更多信息,请点击此处。 回答2 您可以在使用添加等操作时强制执行自动数字转换 select MAX(ch1+0) as max_ch1, MIN(ch1+0) as min_ch1 from t9
  • 如何在 C# 中从 System.Array 转换为 object[](How do I convert from System.Array to object[] in C#)
    问题 我有一个 COM 函数,它需要object[]作为参数: foo(object[] values) 我想将一些enum字段传递给它,所以我使用以下内容: object[] fields = (object[])Enum.GetValues(typeof(SomeEnumType)); 但是,当我尝试将fields传递给foo(...)即 [ foo(fields) ] 时,我收到一个错误: “无法将‘SomeEnumType[]’类型的对象转换为‘system.Object[]’类型。 谁能告诉我我做错了什么? 回答1 正如例外所说,您不能将SomeEnumType[]转换为object[] - 前者是一个数组,其中每个值都是一个SomeEnumType值; 后者是一个数组,其中每个元素都是一个引用。 使用 LINQ,您可以轻松创建一个新数组: object[] fields = Enum.GetValues(typeof(SomeEnumType)) .Cast<object>() .ToArray(); 这将基本上将每个元素(每个枚举值)装箱以创建一个IEnumerable<object> ,然后从中创建一个数组。 它类似于 Tilak 的方法,但当我实际上不需要通用投影时,我更喜欢使用Cast 。 或者: SomeEnumType[] values =
  • 使用Swift将项目添加到钥匙串(Adding item to keychain using Swift)
    问题 我正在尝试使用Swift将项目添加到iOS钥匙串中,但无法弄清楚如何正确地进行类型转换。 在WWDC 2013大会709上给出了以下Objective-C代码: NSData *secret = [@"top secret" dataWithEncoding:NSUTF8StringEncoding]; NSDictionary *query = @{ (id)kSecClass: (id)kSecClassGenericPassword, (id)kSecAttrService: @"myservice", (id)kSecAttrAccount: @"account name here", (id)kSecValueData: secret, }; OSStatus = SecItemAdd((CFDictionaryRef)query, NULL); 尝试在Swift中执行以下操作: var secret: NSData = "Top Secret".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) var query: NSDictionary = [ kSecClass: kSecClassGenericPassword, kSecAttrService: "MyService"
  • 如何在c中从一种类型转换为另一种类型(how to cast from one type to another in c)
    问题 我有以下代码 #include <stdio.h> #include<ctype.h> typedef struct { int Type; int Type2; }foo; typedef struct { char cData[40]; }bar; int main() { bar b1; strcpy(b1.cData,"11"); foo *f=(struct foo *)&b1; printf("Type is %d \n",f->Type); return 0; } 但是我没有在 f 的指针中获得类型 1 的值,而是获得了该特定结构的大小。 回答1 当我运行代码时(纠正错误后),它打印 12593。这是 49*256 + 49 - 换句话说,“11”作为一个整数(ascii 1 是 49)。 所以就我所见,代码没有任何问题(除了 Benoit 指出的内存布局假设),所以我们确实需要知道你期望发生什么 #include <stdio.h> #include<ctype.h> typedef struct { int Type; int Type2; }foo; typedef struct { char cData[40]; }bar; int main() { bar b1; foo *f=(foo *)&b1; strcpy(b1.cData,"11")
  • 使用 ARC 进行指针转换(Pointer casting with ARC)
    问题 ARC 给我带来了以下演员的困难: NSDictionary *attributes; SecItemCopyMatching((__bridge CFDictionaryRef)keychainItemQuery, (CFTypeRef *)&attributes); 错误:ARC 不允许将间接指针转换为指向“CFTypeRef ”(又名“const void * ”)的 Objective-C 指针 回答1 问题是属性不应该是字典,它应该是 SecKeyRef 或 CFDataRef。 然后将其转换回 NSData 以获取复制到其中的密码数据。 像这样: CFDataRef attributes; SecItemCopyMatching((__bridge CFDictionaryRef)keychainItemQuery, (CFTypeRef *)&attributes); NSData *passDat = (__bridge_transfer NSData *)attributes; 回答2 当我们在做类似的事情并使用上面的例子时,我们面临另一个问题: CFDataRef resultRef; OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)searchDictionary,
  • 快速将NSData转换为sockaddr结构(Convert NSData to sockaddr struct in swift [duplicate])
    问题 这个问题已经在这里有了答案: 如何在Swift中从DNS查询中获取真实IP地址? (3个答案) 12个月前关闭。 我正在尝试快速进行简单的DNS查找。 到目前为止,这是我拥有的代码: let hostRef = CFHostCreateWithName(kCFAllocatorDefault, "google.com").takeRetainedValue() var resolved = CFHostStartInfoResolution(hostRef, CFHostInfoType.Addresses, nil) let addresses = CFHostGetAddressing(hostRef, &resolved).takeRetainedValue() as NSArray 此时,“地址” NSArray中的每个元素都是一个CFDataRef对象,该对象包装了一个sockaddr结构。 由于CFDataRef可以免费连接到NSData,因此可以像这样循环遍历它们: for address: AnyObject in addresses { println(address) // address is of type NSData. } 到目前为止,一切都很好(我认为)。 当我在单元测试中运行时,这会打印出有效的外观数据。 这是我被卡住的地方。 为了我的一生