我尝试的第一个想法是根据以下答案获取当前空间 ID:Detecting when a space changes in Spaces in Mac OS X。这里的问题是密钥kCGWindowWorkspace
在 OSX 10.8 中已弃用。所以没有直接的方法来获取这些信息。
在我的解决方案中,我现在检查不同的窗口或所有者,它们只是仪表板空间之一或所有其他空间:
- 如果有一个以
kCGWindowName
结尾的窗口,则用户在仪表板上.wdgt/
- 如果有一个窗口,则用户不在
kCGWindowName == System Status Item Clone
仪表板上,kCGWindowOwnerName == SystemUIServer | Finder
那么为什么我不只是使用.wdgt/
支票呢?-- 因为如果仪表板上现在有小部件,这不起作用
那么为什么我要使用多个窗口检查呢?-。因为我不确定哪个窗口总是在所有空间上。至少System Status Item Clone
并不Finder
总是在那里。
这里我的实现是将此函数作为类别添加到 NSWorkspace
- (BOOL) userIsOnDashboardSpace {
NSArray* windowsInSpace = (__bridge NSArray *) CGWindowListCopyWindowInfo(kCGWindowListOptionAll | kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
NSUInteger indexOfWidget = [windowsInSpace indexOfObjectPassingTest:^BOOL(NSDictionary* obj, NSUInteger idx, BOOL *stop) {
if ([obj objectForKey:(id)kCGWindowName]) {
NSString *name = (NSString *)[obj objectForKey:(id)kCGWindowName];
if ([name isEqualToString:@"System Status Item Clone"]) {
*stop = true;
return false;
}
if ([name hasSuffix:@".wdgt/"]) {
*stop = true;
return true;
}
}
if ([obj objectForKey:(id)kCGWindowOwnerName]) {
NSString *name = (NSString *)[obj objectForKey:(id)kCGWindowOwnerName];
if ([name isEqualToString:@"SystemUIServer"]) {
*stop = true;
return false;
}
if ([name isEqualToString:@"Finder"]) {
*stop = true;
return false;
}
}
return false;
}];
return indexOfWidget != NSNotFound;
}