【问题标题】:Detecting when a space changes in Spaces in Mac OS X在 Mac OS X 的 Spaces 中检测空间何时发生变化
【发布时间】:2011-01-25 17:26:14
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    正如 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 services,以更改音量this may be helpful

    【讨论】:

    • 谢谢。但是,如果空间中没有窗户怎么办?这种情况可以通过公共 API 处理吗?
    • 在您的应用程序中创建一个透明窗口并将其设置为加入所有空间,然后在窗口数组中查找它。要将窗口设置在所有空间上,请使用以下命令:[transparentWindow setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces]
    • 在使用kCGWindowWorkspace 时,我注意到在第一个空间(在 Lion 上)之后的空间重新启动后,空间 ID 会发生变化。这使得存储 ID 几乎毫无用处……还有其他公共 API 吗? (可能与此有关:openradar.appspot.com/9241430
    • 我知道这是一个老问题,但是 NSWorkspaceActiveSpaceDidChangeNotification 仍然相关吗?我似乎无法让它工作。我是 mac 开发的新手,所以可能会遗漏一些东西。每当用户切换桌面空间并在应用程序委托中观察此通知时,我都会尝试收到通知。我错过了什么?
    • 我知道这个答案已有 9 年历史,但我想我会提醒一下 kCGWindowWorkspace 不再可用。尝试使用它会给出错误消息:“kCGWindowWorkspace”在 macOS 中不可用:不再支持。看起来它在 macOS 10.9 中已被弃用
    【解决方案2】:

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

    【讨论】:

    • 是的,但该通知仅告诉您空间发生了变化。但是没有带有该通知的 userInfo 字典,其中包含当前空间等信息。所以它并不是一个真正强大的通知..
    猜你喜欢
    • 2010-10-07
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 2013-07-05
    • 2016-12-28
    • 2012-10-03
    • 2012-05-17
    • 2011-01-13
    相关资源
    最近更新 更多