我正在研究一个简单的Mac应用程序,该应用程序可以检测外部屏幕何时拔出,保存所有窗口的位置,并且一旦外部屏幕再次插入,将所有窗口恢复为其原始位置。 (我知道有应用程序在那里了,我只是好奇,如何做到这一点)CGWindowListCopyWindowInfo:多个屏幕和更改属性
很多搜索之后,我终于用
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吗?或者有另一种方法可以使用?
谢谢,还没有测试过,但会尽快。我刚刚注意到在更新到小牛之后,它实际上已经照顾到了这一点,现在屏幕正在返回到它的原始屏幕。 –