最前面的窗口使用CGWindowListCopyWindowInfo [英] Front most window using CGWindowListCopyWindowInfo

查看:1952
本文介绍了最前面的窗口使用CGWindowListCopyWindowInfo的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

什么是SystemUIServer,这些不是我最前面的应用程序。感谢!

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

推荐答案

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

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.

你的问题的答案是windows是从前到后排序的,但是有更多的用户界面元素定义为窗口,而不是您期望的。这包括菜单栏,Dock,服务菜单,桌面等。这些是在不同的级别定义的,对应于输出中的 kCGWindowLayer

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.

您希望在标准窗口级别(零)定义第一个窗口。如果你看看你的输出,第一个窗口 kCGWindowLayer == 0 实际上是第七个。

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.

这篇关于最前面的窗口使用CGWindowListCopyWindowInfo的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆