如何从kCGWindowNumber获得NSWindow大小?

时间:2013-12-11 13:49:50

标签: macos cocoa nswindow

- (void) GetClientRect 

    NSArray *screenArray = [NSScreen screens];
    NSScreen *mainScreen = [NSScreen mainScreen];
    unsigned screenCount = [screenArray count];
    unsigned index  = 0;

    for (index; index < screenCount; index++)
    {
        NSScreen *screen = [screenArray objectAtIndex: index];
        NSRect screenRect = [screen visibleFrame];
        NSString *mString = ((mainScreen == screen) ? @"Main" : @"not-main");

        NSLog(@"Screen #%d (%@) Frame: %@", index, mString, NSStringFromRect(screenRect));
    }
}

以上方法用于获取主屏幕框架。 但是我想要返回已经通过了kCGWindowNumber的NSWindow的屏幕尺寸的方法。 有什么想法吗?!

1 个答案:

答案 0 :(得分:1)

为什么使用CGWindowID(我认为kCGWindowNumber的意思)?在大多数情况下,这是非常不自然的事情。

无论如何,您可以调用CGWindowListCopyWindowInfo(0, theWindowID)并检查返回数组的第一个元素中的字典。使用键kCGWindowBounds获取边界矩形的字典表示,然后使用CGRectMakeWithDictionaryRepresentation()将其转换为CGRect


您是否正在寻找如何将Cocoa坐标系中的NSWindow -frame转换为Core Graphics坐标系? Cocoa坐标系的起源位于主显示屏的底部 - 左侧,Y在向上方向上增加。核心图形坐标系的起源位于主显示屏的顶部 - 左侧,Y在向下方向上增加。

所以,转换看起来像这样:

NSWindow* window = /* ... comes from wherever ... */;
NSRect frame = window.frame;
frame.origin.y = NSMaxY([NSScreen.screens.firstObject frame]) - NSMaxY(frame);
CGRect cgbounds = NSRectToCGRect(frame);