-
-
Save Noitidart/32d52f0a048cf6a60947c539b8c967e4 to your computer and use it in GitHub Desktop.
Make window frontmost (BUT not floating. I don't know how to make windows floating)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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>() -> T { | |
let ptr = UnsafeMutablePointer<T>.alloc(1) | |
AXValueGetValue(self, AXValueGetType(self), ptr) | |
let val = ptr.memory | |
ptr.destroy() | |
return val | |
} | |
} | |
extension AXUIElement { | |
func getAttribute<T>(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<T: AnyObject>(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)!) | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Cocoa | |
class AXWindow { | |
let app: AXUIElement | |
let window: AXUIElement | |
init(app: AXUIElement, window: AXUIElement) { | |
self.app = app | |
self.window = window | |
} | |
class func initWithCGWindow(cgWindow: CGWindow) -> AXWindow? { | |
let app = AXUIElementCreateApplication(pid_t(cgWindow.ownerPID)).takeRetainedValue(); | |
let windows: [AXUIElement] = app.getAttribute("Windows") | |
for window in windows { | |
let title: String = window.getAttribute("Title") | |
if title != cgWindow.name { | |
continue | |
} | |
let point: NSPoint = window.getAttribute("Position") | |
if point != cgWindow.bounds.origin { | |
continue | |
} | |
let size: NSSize = window.getAttribute("Size") | |
if size != cgWindow.bounds.size { | |
continue | |
} | |
return AXWindow(app: app, window: window) | |
} | |
return nil | |
} | |
func setPosition(view: NSView) { | |
let screenRect = view.screenRect() | |
self.window.setBounds(screenRect) | |
toFrontQueue.push(self) | |
} | |
func bringToFront() { | |
Swift.print("bringToFront") | |
self.app.setAttribute("Frontmost", value: true) | |
self.window.setAttribute("Main", value: true) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment