【问题标题】:Determine which display a window is on in macOS确定 macOS 中的窗口在哪个显示器上
【发布时间】:2016-11-30 06:47:05
【问题描述】:

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

CFArrayRef windowList =  CGWindowListCopyWindowInfo(kCGWindowListOptionIncludingWindow, windowID);
CFArrayApplyFunction(windowList, CFRangeMake(0, CFArrayGetCount(windowList)), &WindowListApplierFunction, this);
CFRelease(windowList);

【问题讨论】:

    标签: objective-c macos


    【解决方案1】:

    您可以为此使用 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
        }
    }
    

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

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

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

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

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

    Determine which screen a window is on given the window ID

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

    【讨论】:

    • 感谢您的回答。我得到一个 CGWindowID 并用它来捕获图像。那么另一个问题,如何从CGWindowID中获取NSWindow?
    • 我将更新我的答案以解释您如何做到这一点。
    • NSWindow *window = [NSApplication windowWithWindowNumber:(NSInteger)windowID];我在我的代码中尝试了这个函数,但它没有用。因为目标窗口在另一个进程中。如何处理这个问题?
    • @Mr.Duan 检查然后这个来自 Apple 的示例代码:它应该做你想做的事:developer.apple.com/library/content/samplecode/SonOfGrab/…
    • 一个很好的示例,但与我想做的有一些不同。捕获窗口后,我想知道窗口在显示器上的位置,并将其绘制成与显示器相同大小的图像。所以我需要知道窗口在哪个显示器上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 2013-04-28
    相关资源
    最近更新 更多