检测Mac OS X中空格何时发生变化

时间:2010-03-10 02:21:39

标签: objective-c cocoa macos osx-snow-leopard osx-leopard

假设我想编写一个简单的Cocoa应用程序,以使Leopard的Spaces功能更有用。我想将每个空间配置为具有不同的

  • 屏幕分辨率
  • 键盘布局
  • 音量(音频用)

所以我的问题分为两部分:

  1. 我想有办法可以独立于Spaces修改这三个东西,对吧?如果是这样,怎么样?
  2. 如何在发生空间变化时在我的应用中检测到这种情况,当发生这种情况时,确定用户刚切换到的空间? Leopard会发送一些分布式通知吗?
  3. 更新:从Mac App Store上的所有与Spaces相关的应用程序来判断,必须有一些公共API方法。

2 个答案:

答案 0 :(得分:11)

正如Peter所说,在10.6中,您可以使用NSWorkSpace NSWorkspaceActiveSpaceDidChangeNotification在工作区更改时收到通知。

然后,您可以使用Quartz API确定当前空间,kCGWindowWorkspace字典键保存工作区。 例如:

int currentSpace;
// get an array of all the windows in the current Space
CFArrayRef windowsInSpace = CGWindowListCopyWindowInfo(kCGWindowListOptionAll | kCGWindowListOptionOnScreenOnly, kCGNullWindowID);      

// now loop over the array looking for a window with the kCGWindowWorkspace key
for (NSMutableDictionary *thisWindow in (NSArray *)windowsInSpace)
{
     if ([thisWindow objectForKey:(id)kCGWindowWorkspace])
       {
           currentSpace = [thisWindow objectForKey(id)kCGWindowWorkspace] intValue];
           break;
       }
}

或者你可以使用私有API获取Space,看看CGSPrivate.h,它允许你这样做:

int currentSpace = 0;
CGSGetWorkspace(_CGSDefaultConnection(), &currentSpace);

要更改屏幕分辨率,您需要查看Quartz services,以更改音量this may be helpful

答案 1 :(得分:5)

NSWorkspace在自己的通知中心发布NSWorkspaceActiveSpaceDidChangeNotification,但仅限Snow Leopard。