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

Tib*_*abo 2 macos cocoa

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

示例代码值得赞赏。

Tib*_*abo 5

我想到了:

    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));            
}
Run Code Online (Sandbox Code Playgroud)

  • 您不应该假设“CGWindowListCopyWindowInfo”返回一个 NSMutableArray,并且由于它是一个 Copy 函数,因此您需要释放该数组或使用“__bridge_transfer”。 (2认同)