objective-c - 最前面的窗口使用 CGWindowListCopyWindowInfo

标签 objective-c cocoa xcode macos core-graphics

在文档中,它表示此方法返回的窗口列表:

CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);

将按从前到后的顺序返回窗口。但它并没有...最前面的窗口应该是测试的,但这是这个数组的输出:

2011-03-12 18:18:14.221 test[982:a0f] (
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 22;
            Width = 212;
            X = 1662;
            Y = 0;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 25;
        kCGWindowMemoryUsage = 30104;
        kCGWindowName = "";
        kCGWindowNumber = 14;
        kCGWindowOwnerName = SystemUIServer;
        kCGWindowOwnerPID = 99;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
    },
        {
        kCGWindowAlpha = 0;
        kCGWindowBounds =         {
            Height = 22;
            Width = 1920;
            X = 0;
            Y = 0;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 25;
        kCGWindowMemoryUsage = 5528;
        kCGWindowNumber = 15;
        kCGWindowOwnerName = SystemUIServer;
        kCGWindowOwnerPID = 99;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 22;
            Width = 46;
            X = 1874;
            Y = 0;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 25;
        kCGWindowMemoryUsage = 5528;
        kCGWindowName = "";
        kCGWindowNumber = 12;
        kCGWindowOwnerName = SystemUIServer;
        kCGWindowOwnerPID = 99;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 22;
            Width = 1920;
            X = 0;
            Y = 0;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 24;
        kCGWindowMemoryUsage = 218520;
        kCGWindowName = "Shared Menubar";
        kCGWindowNumber = 6;
        kCGWindowOwnerName = "Window Server";
        kCGWindowOwnerPID = 73;
        kCGWindowSharingState = 2;
        kCGWindowStoreType = 2;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 1058;
            Width = 1920;
            X = 0;
            Y = 22;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 20;
        kCGWindowMemoryUsage = 1200;
        kCGWindowNumber = 13;
        kCGWindowOwnerName = Dock;
        kCGWindowOwnerPID = 98;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 1;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 52;
            Width = 676;
            X = 622;
            Y = 1028;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 19;
        kCGWindowMemoryUsage = 157080;
        kCGWindowName = "Magic Mirror";
        kCGWindowNumber = 16;
        kCGWindowOwnerName = Dock;
        kCGWindowOwnerPID = 98;
        kCGWindowSharingState = 2;
        kCGWindowStoreType = 2;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 382;
            Width = 480;
            X = 335;
            Y = 367;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 0;
        kCGWindowMemoryUsage = 792496;
        kCGWindowName = test;
        kCGWindowNumber = 252;
        kCGWindowOwnerName = test;
        kCGWindowOwnerPID = 982;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
        kCGWindowWorkspace = 1;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 807;
            Width = 1206;
            X = 321;
            Y = 157;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 0;
        kCGWindowMemoryUsage = 4055280;
        kCGWindowName = "AppDelegate.m - test";
        kCGWindowNumber = 24;
        kCGWindowOwnerName = Xcode;
        kCGWindowOwnerPID = 132;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
        kCGWindowWorkspace = 1;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 967;
            Width = 960;
            X = 175;
            Y = 22;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 0;
        kCGWindowMemoryUsage = 3817968;
        kCGWindowName = "test - Debugger Console";
        kCGWindowNumber = 31;
        kCGWindowOwnerName = Xcode;
        kCGWindowOwnerPID = 132;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
        kCGWindowWorkspace = 1;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 967;
            Width = 1845;
            X = 121;
            Y = 22;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 0;
        kCGWindowMemoryUsage = 882288;
        kCGWindowName = "CocoaDev Forums - get focused window id";
        kCGWindowNumber = 80;
        kCGWindowOwnerName = "Google Chrome";
        kCGWindowOwnerPID = 244;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
        kCGWindowWorkspace = 1;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 784;
            Width = 885;
            X = 560;
            Y = 157;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 0;
        kCGWindowMemoryUsage = 318768;
        kCGWindowName = "Console Messages";
        kCGWindowNumber = 125;
        kCGWindowOwnerName = Console;
        kCGWindowOwnerPID = 482;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
        kCGWindowWorkspace = 1;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 494;
            Width = 1167;
            X = 519;
            Y = 417;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 0;
        kCGWindowMemoryUsage = 2441264;
        kCGWindowName = Debug;
        kCGWindowNumber = 54;
        kCGWindowOwnerName = Finder;
        kCGWindowOwnerPID = 100;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
        kCGWindowWorkspace = 1;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 382;
            Width = 480;
            X = 335;
            Y = 367;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 0;
        kCGWindowMemoryUsage = 55216;
        kCGWindowName = test;
        kCGWindowNumber = 223;
        kCGWindowOwnerName = test;
        kCGWindowOwnerPID = 849;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
        kCGWindowWorkspace = 1;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 437;
            Width = 770;
            X = 396;
            Y = 308;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 0;
        kCGWindowMemoryUsage = 238512;
        kCGWindowName = Applications;
        kCGWindowNumber = 19;
        kCGWindowOwnerName = Finder;
        kCGWindowOwnerPID = 100;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
        kCGWindowWorkspace = 1;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 437;
            Width = 770;
            X = 450;
            Y = 429;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 0;
        kCGWindowMemoryUsage = 332720;
        kCGWindowName = Applications;
        kCGWindowNumber = 17;
        kCGWindowOwnerName = Finder;
        kCGWindowOwnerPID = 100;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
        kCGWindowWorkspace = 1;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 14;
            Width = 1920;
            X = 0;
            Y = 22;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = "-20";
        kCGWindowMemoryUsage = 5528;
        kCGWindowName = "Backstop Menubar";
        kCGWindowNumber = 11;
        kCGWindowOwnerName = "Window Server";
        kCGWindowOwnerPID = 73;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 1080;
            Width = 1920;
            X = 0;
            Y = 0;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = "-2147483627";
        kCGWindowMemoryUsage = 1200;
        kCGWindowName = "";
        kCGWindowNumber = 10;
        kCGWindowOwnerName = Finder;
        kCGWindowOwnerPID = 100;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 1;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 1080;
            Width = 1920;
            X = 0;
            Y = 0;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = "-2147483628";
        kCGWindowMemoryUsage = 8328600;
        kCGWindowName = Desktop;
        kCGWindowNumber = 2;
        kCGWindowOwnerName = "Window Server";
        kCGWindowOwnerPID = 73;
        kCGWindowSharingState = 2;
        kCGWindowStoreType = 2;
    }
)

什么是 SystemUIServer、dock 和 magic mirror?这些不是我最常用的应用程序。谢谢!

最佳答案

获取 Apple 示例应用程序的副本:Son Of Grab .然后构建并运行它,您将拥有一个非常方便的交互式应用程序,用于调查窗口服务器已知的所有窗口。

您的问题的答案是窗口是从前到后排列的,但是定义为窗口的用户界面元素比您预期的要多得多。这包括菜单栏、停靠栏、服务菜单、桌面等。这些在不同级别定义,对应于输出中的 kCGWindowLayer

您想要在标准窗口级别(零)定义第一个窗口。如果您查看输出,第一个带有 kCGWindowLayer == 0 的窗口实际上是第 7 个。

关于objective-c - 最前面的窗口使用 CGWindowListCopyWindowInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5286274/

相关文章:

iphone - 如何使用 NSUserDefaults 更新 key 的数据

ios - AudioServicesPlaySystemSound 奇怪的行为

ios - HealthKit 授权状态始终为 1

objective-c - 选定的菜单项颜色未对齐?

objective-c - 自定义 NSTextView 边框问题

objective-c - 简单的绘图应用程序设计——Hillegass Book,Ch。 18

ios - 在版本比 Base SDK 更新的 iOS 设备上调试

ios - 禁止使用 NSLog

iOS 应用程序错误 - 无法将自身添加为 subview

objective-c - 无法使用自定义颜色更改标签栏 tintColor