James Waldrop
James Waldrop

Reputation: 545

how to use AXUIElementCopyAttributeValue from Swift?

I am trying to use AXUIElementCopyAttributeValue from Swift. My best stab currently looks like this:

private func mainWindow() -> Optional<AXUIElementRef> {
    let appRef = AXUIElementCreateApplication(self.pid())
    var ptr: Unmanaged<AXUIElementRef>? = nil
    var frontWindow: AXUIElementRef? = nil
    let err = AXUIElementCopyAttributeValue(appRef, kAXMainWindowAttribute, &ptr)
    if err == AXError(kAXErrorSuccess) {
        frontWindow = ptr!.takeRetainedValue()
    }
    return frontWindow
}

Unfortunately kAXMainWindowAttribute is not in scope. This works in ObjC of course, but I can't figure out where the value is hiding when accessed from Swift. This isn't the first time I've had this problem, either, although previously I've been able to stumble around a bit and find it.

Also, I'd be happy to receive any stylistic suggestions here. I'm not convinced I'm doing this in the most natural way for Swift.

Upvotes: 3

Views: 2244

Answers (1)

lupdidup
lupdidup

Reputation: 311

It is an old question but I still drop it here in case someone else searches for it:

let appRef = AXUIElementCreateApplication(pid)
var value: AnyObject?
AXUIElementCopyAttributeValue(appRef, kAXMainWindowAttribute as CFString, &value)

also, I assume you get the "Swift dynamic cast failed" error message because you try to cast from AXUIElement to AnyObject. You can cast it like so:

print(value as! AXUIElement)

Upvotes: 3

Related Questions