import Cocoa extension AXValue { class func initWith(t: Any) -> AXValue? { var t = t switch t { case is CGPoint: return AXValueCreate(AXValueType(rawValue: kAXValueCGPointType)!, &t)!.takeRetainedValue() case is CGSize: return AXValueCreate(AXValueType(rawValue: kAXValueCGSizeType)!, &t)!.takeRetainedValue() default: return nil } } func convertTo() -> T { let ptr = UnsafeMutablePointer.alloc(1) AXValueGetValue(self, AXValueGetType(self), ptr) let val = ptr.memory ptr.destroy() return val } } extension AXUIElement { func getAttribute(key: String) -> T { var ptr: AnyObject? AXUIElementCopyAttributeValue(self, "AX\(key)", &ptr) if key == "Size" || key == "Position" { let val = ptr as! AXValue return val.convertTo() } return ptr as! T } func setAttribute(key: String, value: T) { AXUIElementSetAttributeValue(self, "AX\(key)", value) } func setBounds(bounds: NSRect) { // 移动窗口并调整窗口大小 setAttribute("Position", value: AXValue.initWith(bounds.origin)!) setAttribute("Size", value: AXValue.initWith(bounds.size)!) } }