2017-11-24 2 views
0

Ist es in Swift möglich, eine Liste aller Anwendungen mit einem Fenster im Vordergrund zu bekommen und dann die Größe und Position dieser Fenster einzustellen.Legen Sie die Größe und Position aller Fenster auf dem Bildschirm in swift

erhalte ich die Liste der Fenster Eigenschaften wie diese

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!); //TopLevel Accessability Object of PID 
    print(appRef) 

    var value: AnyObject? 
    let result = AXUIElementCopyAttributeValue(appRef, kAXWindowsAttribute as CFString, &value) 

    if result == .success, let windowList = value as? [AXUIElement] 
    { // DO ANYTHING   
    } else 
    { print("Result no Success or no valid windowlist returnd")   
    } 
    } 
} 

Jetzt versuche ich einige der propierties zu ändern, aber das hat keine Wirkung. Auch die Attribute für die TopLevel Barrierrefreiheit Objekt von PID kehrt AXError (kAXErrorCannotComplete = -25.204)

+0

Die Beschreibung dieses Fehlers ist: Die Die Funktion kann nicht abgeschlossen werden, weil die Nachrichtenübertragung fehlgeschlagen ist oder weil die Anwendung, mit der die Funktion kommuniziert, beschäftigt oder nicht reagiert. –

+0

Ich habe mit 2 Systemanwendungen Terminal und Erinnerungen versucht. Mit beiden kAXErrorCannotComplete = -25204. Sollten System-Apps keine Barrierefreiheit unterstützen? – mica

+0

Ich musste die Sandbox ausschalten, um diesen Fehler zu vermeiden – mica

Antwort

0

Verstanden zu erhalten versuchen, dank der Hilfe von @ Martin R

let type = CGWindowListOption.optionOnScreenOnly 
let windowList = CGWindowListCopyWindowInfo(type, kCGNullWindowID) as NSArray? as? [[String: AnyObject]] 

for entry in windowList! 
{ 
    let owner = entry[kCGWindowOwnerName as String] as! String 
    var bounds = entry[kCGWindowBounds as String] as? [String: Int] 
    let pid = entry[kCGWindowOwnerPID as String] as? Int32 

    if owner == "Terminal" 
    { 
    let appRef = AXUIElementCreateApplication(pid!); //TopLevel Accessability Object of PID 

    var value: AnyObject? 
    let result = AXUIElementCopyAttributeValue(appRef, kAXWindowsAttribute as CFString, &value) 

    if let windowList = value as? [AXUIElement] 
    { print ("windowList #\(windowList)") 
     if let window = windowList.first 
     {    
     var position : CFTypeRef 
     var size : CFTypeRef 
     var newPoint = CGPoint(x: 0, y: 0) 
     var newSize = CGSize(width: 800, height: 800) 

     position = AXValueCreate(AXValueType(rawValue: kAXValueCGPointType)!,&newPoint)!; 
     AXUIElementSetAttributeValue(windowList.first!, kAXPositionAttribute as CFString, position); 

     size = AXValueCreate(AXValueType(rawValue: kAXValueCGSizeType)!,&newSize)!; 
     AXUIElementSetAttributeValue(windowList.first!, kAXSizeAttribute as CFString, size); 
     } 
    } 
    } 
} 
Verwandte Themen