2

示例代码是

    [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(activeSpaceDidChange:) name:NSWorkspaceActiveSpaceDidChangeNotification object:nil];

然后

- (void) activeSpaceDidChange:(NSNotification *)aNotification {
         // code to check if current workspace is dashboard?
}

我想检查当前空间是否是仪表板?任何想法?

4

1 回答 1

4

我尝试的第一个想法是根据以下答案获取当前空间 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;

}

于 2013-04-08T20:28:24.613 回答