确定窗口在 macOS 中的哪个显示

Mr.*_*uan 3 macos objective-c

我有一个窗口的 CGWindowID 和我的 Mac 的所有 CGDirectDisplayID。然后我想知道哪个显示窗口。我尝试获取窗口的 CGWindowInfo?但找不到有用的信息。

CFArrayRef windowList =  CGWindowListCopyWindowInfo(kCGWindowListOptionIncludingWindow, windowID);
CFArrayApplyFunction(windowList, CFRangeMake(0, CFArrayGetCount(windowList)), &WindowListApplierFunction, this);
CFRelease(windowList);
Run Code Online (Sandbox Code Playgroud)

jva*_*ela 5

您可以为此使用 NSScreen API。使用[NSScreen screens]检索您的计算机连接到屏幕,再搭配屏幕的返回[myWindow screen]

如果您拥有想要知道在哪个屏幕上的窗口,请执行以下操作:

CGWindowID windowID = ... // init with your value
NSWindow *window = [NSApplication windowWithWindowNumber:(NSInteger)windowID];

if ([[NSScreen screens] count] > 1)
{
    // you have more than one screen attached
    NSScreen *currentScreen = [window screen];

    // you can then test if the window is on the main display
    if (currentScreen == [NSScreen mainScreen])
    {
        // your window is on the main screen
    }
    else
    {
       // your window is not on the main screen
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您不拥有该窗口,因为它是由另一个应用程序拥有的,那么我建议您首先了解NSScreenCGWindow API 使用的 Quartz 坐标系和 Core Graphics 坐标系之间的区别。这里有一篇很好的文章(英文):

http://www.thinkandbuild.it/deal-with-multiple-screens-programming/

和这里(日语)(如果您不懂日语,请使用谷歌翻译器):

http://xcatsan.blogspot.com/2009/09/nsscreen-cgwindow.html

其次,您需要按照我推荐的 Grab 示例代码之子的说明或此处的说明检索窗口边界:

给定窗口 ID 确定窗口在哪个屏幕上

然后,您需要按照建议计算窗口边界所在的屏幕。