【问题标题】:how to get NSWindow size from kCGWindowNumber?如何从 kCGWindowNumber 获取 NSWindow 大小?
【发布时间】:2013-12-11 13:49:49
【问题描述】:
- (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 的屏幕大小的方法。 有什么想法吗?!

【问题讨论】:

    标签: macos cocoa nswindow


    【解决方案1】:

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

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


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

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

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

    【讨论】:

    • 嗨@Ken 我需要从NSWindowCGWindowID 的原因是因为我试图将新创建的窗口移动到另一个工作区(Firefox 创建新窗口并给我NSWindow 给它)是否有可能从NSWindow 获得kCGWindowNumber?我正在使用这种方法将窗口移动到另一个工作区 - stackoverflow.com/a/2368945/1828637
    • 没有记录的方法可以从NSWindow 获取CGWindowID。目前尚不清楚-windowNumber 警告是否真的与CGWindowID 或窗口服务器使用的其他数字有关。即使是这样,它也可能意味着-windowNumber 并不总是 等于窗口的CGWindowID,因为它对于离屏窗口是负数。在实践中,很多人都依赖于这样一个事实:对于屏幕窗口,-windowNumberCGWindowID 相同。
    • 如果您不想依赖该假设,您的代码可以通过获取CGWindowIDNSWindow-windowNumber 的窗口的窗口信息来验证它,使用@ 987654347@,然后将所有属性与NSWindow 进行比较。如果找不到窗口或属性不匹配,您可以使用相同的功能获取所有窗口的信息,搜索其属性全部匹配的窗口,然后从中获取kCGWindowNumber。如果您的目标进程中有两个相同的窗口,这很容易出现误报。
    • 我已经更新了我的答案,其中包含有关如何从 NSWindow-frame 转换为 Core Graphics 坐标系的说明,这对于与窗口信息字典中的边界进行比较是必要的在kCGWindowBounds 键下。
    • 你太客气了。别客气。我很高兴能帮上忙。
    猜你喜欢
    • 2011-11-27
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    相关资源
    最近更新 更多