Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

In the documentation, it says that list of windows returned by this method:

CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);

will return windows in order from front to back. But it doesn't...The front most window should be test, but here's the out of this array:

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;
    }
)

What's SystemUIServer, dock and magic mirror? These aren't my front most apps. Thanks!

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
391 views
Welcome To Ask or Share your Answers For Others

1 Answer

Grab a copy of Apple's sample app: Son Of Grab. Then build and run it, and you'll have a very handy interactive app for investigating all the windows known to the window server.

The answer to your question is that windows are ordered front to back, but there are far more user interface elements defined as windows than you are expecting. This includes the menubar, the dock, the services menu, the Desktop, etc. These are defined at different levels, corresponding to kCGWindowLayer in your output.

You want the first window defined at the standard window level (zero). And if you look at your output, the first window with kCGWindowLayer == 0 is in fact the 7th.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...