gpt4 book ai didi

objective-c - CGWindowListCopyWindowInfo : multiple screens and changing properties

转载 作者:搜寻专家 更新时间:2023-10-30 20:18:41 28 4
gpt4 key购买 nike

我正在开发一个简单的 Mac 应用程序,它可以检测外部屏幕何时拔下,保存所有窗口的位置,一旦外部屏幕再次插入,将所有窗口恢复到其原始位置。 (我知道已经有应用程序了,我只是好奇这是怎么做到的)

经过大量搜索,我终于设法通过使用将所有窗口显示在屏幕上

NSArray *openWindows = [[NSWorkspace sharedWorkspace] runningApplications];
CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);

这会返回类似的东西

{
kCGWindowAlpha = 1;
kCGWindowBounds = {
Height = 22;
Width = 279;
X = 1559;
Y = 0;
};
kCGWindowIsOnscreen = 1;
kCGWindowLayer = 25;
kCGWindowMemoryUsage = 13596;
kCGWindowName = "";
kCGWindowNumber = 18;
kCGWindowOwnerName = SystemUIServer;
kCGWindowOwnerPID = 260;
kCGWindowSharingState = 1;
kCGWindowStoreType = 2;
},
{
kCGWindowAlpha = 0;
kCGWindowBounds = {
Height = 22;
Width = 1920;
X = 0;
Y = 0;
};
kCGWindowIsOnscreen = 1;
kCGWindowLayer = 25;
kCGWindowMemoryUsage = 5404;
kCGWindowNumber = 19;
kCGWindowOwnerName = SystemUIServer;
kCGWindowOwnerPID = 260;
kCGWindowSharingState = 1;
kCGWindowStoreType = 2;
},

然后我会遍历数组并查看每个单独的窗口

 for (int i = 0; i < CFArrayGetCount(windowList); i++) {
CFDictionaryRef ref = CFArrayGetValueAtIndex(windowList, i);

NSLog(@"%@", CFDictionaryGetValue(ref, kCGWindowBounds));
}

但这就是我卡住的地方,我如何才能首先知道在使用多个屏幕时窗口在哪个屏幕上。其次,以后如何调整窗口边界?每个应用程序都有自己的 ID 吗?或者我可以使用其他方法吗?

最佳答案

由于 CGWindowList API 不公开屏幕 ID,因此您必须根据屏幕边界检查窗口边界:

NSArray* windowList = (__bridge NSArray*)CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
uint32_t maxDisplayCount = 10;
CGDirectDisplayID onlineDisplayIDs[maxDisplayCount];
uint32_t displayCount;
CGGetOnlineDisplayList(maxDisplayCount, (CGDirectDisplayID*)&onlineDisplayIDs, &displayCount);
for(uint32_t i = 0; i < displayCount; ++i)
{
CGRect dspyRect = CGDisplayBounds(onlineDisplayIDs[i]);
for(NSDictionary* windowDict in windowList)
{
CGRect windowRect;
CGRectMakeWithDictionaryRepresentation((__bridge CFDictionaryRef)(windowDict[(id)kCGWindowBounds]), &windowRect);
if(CGRectContainsRect(dspyRect, windowRect))
{
NSLog(@"window %@ is on screen with ID:%d", windowDict[(id)kCGWindowName], onlineDisplayIDs[i]);
}
}
}

上面的代码执行了一个简单的检查,测试一个窗口是否完整地在一个特定的屏幕上。
如果窗口的特定部分覆盖了屏幕,则 OS X 认为该窗口属于该屏幕。 (此行为在 OS X 版本之间也略有变化)

要移动窗口,您可以使用 Apple EventsCocoa Accessibility APIs .
请注意,Cocoa Accessibility 要求您在系统偏好设置中启用“为辅助设备启用访问”。
当您启用 App Sandboxing 时,这两种技术都可能会出现问题。

关于objective-c - CGWindowListCopyWindowInfo : multiple screens and changing properties,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19475578/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com