- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在开发一个简单的 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 Events或 Cocoa Accessibility APIs .
请注意,Cocoa Accessibility 要求您在系统偏好设置中启用“为辅助设备启用访问”。
当您启用 App Sandboxing 时,这两种技术都可能会出现问题。
关于objective-c - CGWindowListCopyWindowInfo : multiple screens and changing properties,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19475578/
我使用以下代码来获取所有窗口: CFArrayRef windows = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kC
CGWindowLevel.h 文件定义了用于设置窗口级别的常量,可用作窗口级别的最大值为 20。但是,如果您使用调用CGWindowListCopyWindowInfo,可以观察到kCGWindow
在文档中,它表示此方法返回的窗口列表: CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOn
我已经使用 CGWindowListCopyWindowInfo 列出了所有窗口(我认为/希望按 z 顺序从前到后),但是我在获取 NSWindow* 时遇到问题这样我就可以与 orderFront:
我正在开发一个简单的 Mac 应用程序,它可以检测外部屏幕何时拔下,保存所有窗口的位置,一旦外部屏幕再次插入,将所有窗口恢复到其原始位置。 (我知道已经有应用程序了,我只是好奇这是怎么做到的) 经过大
我是一名优秀的程序员,十分优秀!