我正在试图找出如何获取所有可见窗口的框架。 我尝试了以下代码,但它仅适用于应用程序本身其他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]));
}
示例代码表示赞赏。
答案 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:]
返回的窗口编号,这些窗口编号不适用于你的应用程序的窗口。