13

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

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

所以我的问题有两个部分:

  1. 我想有一些方法可以独立于 Spaces 来修改这三件事,对吧?如果是这样,怎么做?
  2. 如何在我的应用程序中检测到何时发生空间变化,以及当发生这种情况时,确定用户刚刚切换到的空间?Leopard 是否会发出一些分布式通知之类的?

更新:从 Mac App Store 上所有与 Spaces 相关的应用程序来看,必须有一些公共 API 方式来执行此操作。

4

2 回答 2

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 获取空间,查看CGSPrivate.h,它允许您执行此操作:

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

要更改屏幕分辨率,您需要查看Quartz 服务,对于更改音量,这可能会有所帮助

于 2011-06-05T08:12:16.260 回答
5

NSWorkspaceNSWorkspaceActiveSpaceDidChangeNotification在它自己的通知中心发布了一个,但只在雪豹上发布。

于 2010-03-10T03:54:43.017 回答