CGWindowListCopyWindowInfo、kCGWindowLayer 和窗口级别

spd*_*spd 5 macos window layer quartz-graphics

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

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

JWW*_*ker 5

似乎kCGWindowLayer确实指的是窗口级别,尽管我还没有找到任何文档说。

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


RLT*_*RLT 2

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

  • “kCGWindowLayer”到底是什么。在[文档](https://developer.apple.com/library/mac/documentation/Carbon/Reference/CGWindow_Reference/Constants/Constants.html#//apple_ref/doc/c_ref/kCGWindowLayer)中,它只说`kCGWindowLayer ` 是 **窗口层数** ,不解释窗口层数。 (2认同)