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

Enc*_*ada 13 macos cocoa osx-leopard objective-c osx-snow-leopard

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

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

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

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

更新:从Mac App Store中的所有Spaces相关应用程序判断,必须有一些公共API方法.

Ben*_*Low 11

正如彼得所说,在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;
       }
}
Run Code Online (Sandbox Code Playgroud)

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

int currentSpace = 0;
CGSGetWorkspace(_CGSDefaultConnection(), &currentSpace);
Run Code Online (Sandbox Code Playgroud)

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

  • 在您的应用程序中创建一个透明窗口并将其设置为连接所有空格,然后在窗口数组中查找.要将窗口设置为所有空格,请使用:[transparentWindow setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces] (2认同)
  • 我知道这个答案已经有 9 年历史了,但我想我应该提醒一下 kCGWindowWorkspace 不再可用。尝试使用它会出现错误消息:“kCGWindowWorkspace”在 macOS 中不可用:不再支持。看起来它在 macOS 10.9 中已被弃用 (2认同)

Pet*_*sey 5

NSWorkspace NSWorkspaceActiveSpaceDidChangeNotification在其自己的通知中心发布了一个,但仅限于Snow Leopard.

  • 是的,但该通知仅告知您空间发生了变化.但是没有带有该通知的userInfo字典,其中包含当前空间等信息.所以它并不是一个强大的通知.. (2认同)