代码之家  ›  专栏  ›  技术社区  ›  Ben Packard Ross Knipe

Mac/Cocoa-使用可访问性API获取窗口列表

  •  6
  • Ben Packard Ross Knipe  · 技术社区  · 16 年前

    目标是检查某个窗口是否打开。首先检查应用程序是否正在运行(使用[NSWorkspace runningApplications]并检查每个应用程序),然后检查为该应用程序打开的每个窗口的标题栏文本。

    附言

    因此,我可以使用PID为应用程序创建一个元素:

    AXUIElementRef app = AXUIElementCreateApplication(pid);
    

    3 回复  |  直到 13 年前
        1
  •  3
  •   Peter Hosey    16 年前

    使用 AXUIElementCopyAttributeValues 复制的值 kAXWindowsAttribute

    从它的函数名可以猜到,它如下 the copy rule

        2
  •  12
  •   Thomas Zoechling    16 年前

    我不知道如何从可访问性API获取窗口ID和PID。

    我将使用10.5版以来可用的CGWindowList方法。

    CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
    for (NSMutableDictionary* entry in (NSArray*)windowList) 
    {
        NSString* ownerName = [entry objectForKey:(id)kCGWindowOwnerName];
        NSInteger ownerPID = [[entry objectForKey:(id)kCGWindowOwnerPID] integerValue];
        NSLog(@"%@:%d", ownerName, ownerPID);
    }
    CFRelease(windowList);  
    

    您可以使用选项参数控制是否需要所有窗口(包括屏幕外…)。
    此外,条目对象还包含更多信息。 Documentation link

        3
  •  2
  •   blakeness    6 年前

    let windowList: CFArray? = CGWindowListCopyWindowInfo(.optionOnScreenOnly, kCGNullWindowID)
    
    for entry in windowList! as Array {
    
        let ownerName: String = entry.object(forKey: kCGWindowName) as? String ?? "N/A"
        let ownerPID: Int = entry.object(forKey: kCGWindowOwnerPID) as? Int ?? 0
        print("ownerName: \(ownerName), ownerPID:\(ownerPID)")
    }
    
        4
  •  0
  •   Laurent Etiemble    16 年前

    你可以用 windowNumbersWithOptions: NSWindow 从一个窗口号码。。。