【发布时间】:2011-11-19 11:26:48
【问题描述】:
有没有办法以编程方式将应用程序添加到所有空间?我希望我的应用程序默认位于所有空间。
【问题讨论】:
有没有办法以编程方式将应用程序添加到所有空间?我希望我的应用程序默认位于所有空间。
【问题讨论】:
使用 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"
【讨论】:
你需要的方法在 NSWindow 中。
狮子使用:
- (void)setCollectionBehavior:(NSWindowCollectionBehavior)behavior
对于 pre-Lion 覆盖以下内容以返回 YES:
- (BOOL)canBeVisibleOnAllSpaces
【讨论】:
这段代码对我有用(至少在我最近工作的一个小项目中的 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 中。
【讨论】:
好的。仅以编程方式设置工作区应用绑定不起作用。我试过了:
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 附加条目。然后干掉码头。
【讨论】:
您的应用委托应如下所示...
#import "alwaysOnTopAppDelegate.h"
@implementation alwaysOnTopAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
[window setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces];
}
@end
【讨论】: