Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 确定窗口在macOS中的哪个显示_Objective C_Macos - Fatal编程技术网

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

Objective c 确定窗口在macOS中的哪个显示,objective-c,macos,Objective C,Macos,我有一个窗口的CGWindowID和我的Mac的所有CGDirectDisplayID。 然后我想知道窗口在哪个显示器上。 我试图获取该窗口的CGWindowInfo,但找不到有用的信息 CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionIncludingWindow, windowID); CFArrayApplyFunction(windowList, CFRangeMake(0, CFArrayGe

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

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

您可以使用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
使用的石英坐标系与CGWindow API使用的核心图形坐标系之间的差异。这里有一篇关于这方面的好文章(英文):

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

其次,您需要检索窗口边界,如我推荐的Grab示例代码之子所述,或者如这里所述:


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

谢谢您的回答。我得到一个CGWindowID并用它来捕获图像。那么另一个问题是,如何从CGWindowID获取NSWindow?我将更新我的答案来解释如何做到这一点。NSWindow*window=[NSApplication windowWithWindowNumber:(NSInteger)windowID];我在代码中尝试了这个函数,但它没有用。因为目标窗口在另一个进程中。如何处理这个问题?@Duan先生检查一下苹果的示例代码:它应该做你想做的事情:一个好的示例,但与我想做的有一些不同。捕获窗口后,我想知道窗口在显示器上的位置,并将其绘制成与显示器大小相同的图像。因此,我需要知道窗口在哪个显示器上。