1

我试图弄清楚如何获取所有可见窗口的框架。我尝试了以下代码,但它仅适用于应用程序本身其他窗口报告 {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]));
}

示例代码表示赞赏。

4

2 回答 2

4

我想到了:

    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));            
}
于 2012-04-18T12:14:57.393 回答
1

您不能NSWindow为另一个应用程序的窗口创建一个。通常,您无法访问其他应用程序的对象,除非通过与它们合作的接口(例如脚本)。

您可以使用Quartz Window Services (aka CGWindowList) API获得所需的内容。

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

于 2012-04-18T10:37:13.667 回答