Objective c 确定窗口在macOS中的哪个显示
我有一个窗口的CGWindowID和我的Mac的所有CGDirectDisplayID。 然后我想知道窗口在哪个显示器上。 我试图获取该窗口的CGWindowInfo,但找不到有用的信息Objective c 确定窗口在macOS中的哪个显示,objective-c,macos,Objective C,Macos,我有一个窗口的CGWindowID和我的Mac的所有CGDirectDisplayID。 然后我想知道窗口在哪个显示器上。 我试图获取该窗口的CGWindowInfo,但找不到有用的信息 CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionIncludingWindow, windowID); CFArrayApplyFunction(windowList, CFRangeMake(0, CFArrayGe
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先生检查一下苹果的示例代码:它应该做你想做的事情:一个好的示例,但与我想做的有一些不同。捕获窗口后,我想知道窗口在显示器上的位置,并将其绘制成与显示器大小相同的图像。因此,我需要知道窗口在哪个显示器上。