CGWindowListCopyWindowInfo, kCGWindowLayer и уровень окна - PullRequest
4 голосов
/ 01 апреля 2011

Файл CGWindowLevel.h определяет константы, которые используются для установки уровня окна, и наибольшее значение, которое можно использовать в качестве уровня окна, равно 20. Но если вы получите список окон с помощью вызова CGWindowListCopyWindowInfo, выОбратите внимание, что значение kCGWindowLayer больше 20 (25, 103 и т. д.).

Разве kCGWindowLayer и уровень окна не одинаковы?Если они не совпадают, как я могу получить уровень окна для окон, которые получены с помощью CGWindowListCopyWindowInfo?Если они одинаковы, почему мы получаем значение> 20?

Ответы [ 2 ]

4 голосов
/ 31 января 2015

Похоже, что kCGWindowLayer относится к уровню окна, хотя я не нашел никакой документации, говорящей об этом.

Вы, кажется, думаете, что уровни окон могут быть не более 20 из-за перечисления от kCGBaseWindowLevelKey до kCGAssistiveTechHighWindowLevelKey, последний из которых имеет значение 20. Но это не уровни окон, это ключи, которые можно использовать чтобы посмотреть уровни окна, используя CGWindowLevelForKey. Например, kCGStatusWindowLevelKey имеет значение 9, но kCGStatusWindowLevel определяется как CGWindowLevelForKey(kCGStatusWindowLevelKey), и значение этого значения равно 25.

0 голосов
/ 28 июля 2011

Нет.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);
...