【问题标题】:Cocoa - Programmatically adding an application to all spacesCocoa - 以编程方式将应用程序添加到所有空间
【发布时间】:2011-11-19 11:26:48
【问题描述】:

有没有办法以编程方式将应用程序添加到所有空间?我希望我的应用程序默认位于所有空间。

【问题讨论】:

    标签: cocoa nswindow spaces


    【解决方案1】:

    使用 OS X 附带的默认命令,如下所示:

    defaults write com.apple.dock workspaces-app-bindings -dict-add com.apple.mail 65544
    

    通过发出上述命令,您将“com.apple.mail”标识的应用程序设置为出现在每个空间中。 65544 是一个神奇的值,表示“每个空间”。如果键值对(标识符+设置)存在,则会被覆盖。

    请注意,您必须重新加载 Dock (killall Dock) 并以某种方式从您的应用程序中执行这些命令。在 objective-c 中,您可以使用以下 sn-p 退出 Dock:

    NSRunningApplication *dock = [NSRunningApplicationrunningApplicationWithBundleIdentifier:@"com.apple.dock"];
    [dock terminate];
    

    在 AppleScript 中使用以下内容:

    quit application "Dock"
    

    【讨论】:

    • 感谢您的回复!不过,从应用程序运行命令行工具似乎有点骇人听闻(无意冒犯)。没有API吗?
    • 您可以使用 Cocoa API 中的 NSUserDefaults 来编写默认值:cocoadev.com/index.pl?NSUserDefaults
    【解决方案2】:

    你需要的方法在 NSWindow 中。

    狮子使用:

    - (void)setCollectionBehavior:(NSWindowCollectionBehavior)behavior
    

    对于 pre-Lion 覆盖以下内容以返回 YES:

    - (BOOL)canBeVisibleOnAllSpaces
    

    【讨论】:

    • 这不是只设置窗口允许的内容吗?我认为您必须通过之前的建议专门告诉 com.apple.dock。
    【解决方案3】:

    这段代码对我有用(至少在我最近工作的一个小项目中的 10.6.8 上):

    -(void)windowDidLoad {
        // Make the window visible on all Spaces
        if([[self window] respondsToSelector: @selector(setCollectionBehavior:)]) {
            [[self window] setCollectionBehavior: NSWindowCollectionBehaviorCanJoinAllSpaces];
        }
        else if([[self window] respondsToSelector: @selector(canBeVisibleOnAllSpaces)]) {
            [[self window] canBeVisibleOnAllSpaces]; // AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED
        }
    }
    

    我将此代码放在主应用程序窗口的(a 的自定义子类)WindowController 中。

    【讨论】:

    • 适用于我的匿名 bg 应用程序的浮动窗口。无需弄乱 Dock 首选项。
    【解决方案4】:

    好的。仅以编程方式设置工作区应用绑定不起作用。我试过了:

    1) Verified no entries were in System Preferences->Spaces
    
    2) defaults write com.apple.dock workspaces-app-bindings -dict-add com.apple.mail 65544
    
    3) killall Dock (also needed to kill System Preferences )
    
    4) Opened System Preferences->Spaces to verify the Mail app entry 
       appeared and was set to Every Space
    
    5) Launched Mail, but it was still stuck to Space 1
    
    6) Only when I went back into System Preferences->Spaces and changed the 
       Mail app *from* Every Space and then *back* to Every Space did the Mail 
       app stick to every space
    

    很明显,系统偏好正在做一些额外的事情来激活设置。有谁知道这可能是什么?谢谢!

    更新:所以我能够通过使用 applescript api 而不是用户默认 api 来完成这项工作。以下帖子讲述了如何使用 applescript 附加条目。然后干掉码头。

    Applescript; opening an app in Space number N

    【讨论】:

      【解决方案5】:

      您的应用委托应如下所示...

      #import "alwaysOnTopAppDelegate.h"
      
      @implementation alwaysOnTopAppDelegate
      
      @synthesize window;
      
      - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
      {
          [window setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces];
      }
      
      @end
      

      【讨论】:

      • @Sjoerd 有什么问题可以 Geffen 的回答吗?它似乎更完整,也更正确,因为它是在窗口的实例化代码中执行的,而不是像您的那样,在应用程序的实例化代码中执行(此时可能不会打开所有窗口)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      相关资源
      最近更新 更多