如何获取活动空间上每个可见窗口的框架(原点,大小)?

时间:2012-04-18 10:14:15

标签: macos cocoa

我正在试图找出如何获取所有可见窗口的框架。 我尝试了以下代码,但它仅适用于应用程序本身其他Windows报告{0,0,0,0}

   NSArray *windowArray =  [NSWindow windowNumbersWithOptions:NSWindowNumberListAllApplications | NSWindowNumberListAllSpaces];
for(NSNumber *number in windowArray){
    NSLog(@"Window number: %@", number);
    NSWindow *window = [[NSApplication sharedApplication] windowWithWindowNumber:[number intValue]];
    NSLog(@"Window: %@", NSStringFromRect( [[window contentView] frame]));
}

示例代码表示赞赏。

2 个答案:

答案 0 :(得分:3)

我明白了:

    NSMutableArray *windows = (__bridge NSMutableArray *)CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID);

for (NSDictionary *window in windows) {
    NSString *name = [window objectForKey:@"kCGWindowName" ];
    CGRect bounds;
    CGRectMakeWithDictionaryRepresentation((CFDictionaryRef)[window objectForKey:@"kCGWindowBounds"], &bounds);
    NSLog(@"%@: %@",name,NSStringFromRect(bounds));            
}

答案 1 :(得分:1)

您无法为其他应用程序的窗口创建NSWindow。通常,除了通过与其协作的接口(例如脚本)之外,您无法访问其他应用程序的对象。

您可以使用Quartz Window Services (a.k.a. CGWindowList) API获取您想要的内容。

我完全不确定Cocoa返回的窗口编号是否与该API使用的窗口编号相同。事实上,-[NSWindow windowNumber]的文档特别说“请注意,这与窗口服务器分配的全局窗口编号不同”。我要注意你可以使用+[NSWindow windowNumbersWithOptions:]返回的窗口编号,这些窗口编号不适用于你的应用程序的窗口。