CGWindowListCopyWindowInfo,kCGWindowLayer和窗口级别

时间:2011-04-01 12:58:28

标签: macos window layer quartz-graphics

CGWindowLevel.h文件定义用于设置窗口级别的常量,以及可用作窗口级别为20的最大值。但是,如果使用调用{{1}检索窗口列表},你可以观察到CGWindowListCopyWindowInfo的值超过20(25,103等)。

kCGWindowLayer和窗口级别不一样吗? 如果它们不相同,我如何获得使用kCGWindowLayer获得的窗口的窗口级别? 如果它们相同,为什么我们得到的值> 20?

2 个答案:

答案 0 :(得分:4)

kCGWindowLayer似乎确实引用了一个窗口级别,但我还没有找到任何文档说明这一点。

您似乎认为窗口级别最多为20,因为从kCGBaseWindowLevelKeykCGAssistiveTechHighWindowLevelKey的枚举,最后一个具有值20.但这些不是窗口级别,它们是键可以使用CGWindowLevelForKey查找窗口级别。例如,kCGStatusWindowLevelKey的值为9,但kCGStatusWindowLevel的定义为CGWindowLevelForKey(kCGStatusWindowLevelKey),其值为25。

答案 1 :(得分:0)

没有。 kCGWindowLayer和窗口级别不相同。你无法直接获得窗口级别。但你可以做如下的技巧。

        CFArrayRef windowArray = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
        NSMutableArray *windowsInMap = [NSMutableArray arrayWithCapacity:64];
        NSArray*  windows = (NSArray*)CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
        NSUInteger count = [windows count];
        for (NSUInteger i = 0; i < count; i++)
        {
            NSDictionary*   nswindowsdescription = [windows objectAtIndex:i];
            NSNumber* windowid = (NSNumber*)[nswindowsdescription objectForKey:@"kCGWindowNumber"];
            if(windowid)
            {
                       // Entried will be in front to back order.
            }
        }
        CFRelease(windowArray);