示例代码是
[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(activeSpaceDidChange:) name:NSWorkspaceActiveSpaceDidChangeNotification object:nil];
然后
- (void) activeSpaceDidChange:(NSNotification *)aNotification {
// code to check if current workspace is dashboard?
}
我想检查当前空间是否为仪表板?有什么想法吗?
答案 0 :(得分:4)
首先想到的是根据这个答案获得当前的空间ID:Detecting when a space changes in Spaces in Mac OS X。这里的问题是在OSX 10.8中不推荐使用密钥kCGWindowWorkspace
。所以没有直接的方法来获取这些信息。
在我的解决方案中,我现在检查不同的窗口或所有者,它们只是仪表板空间中的一个或所有其他空间:
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;
}