如何以编程方式更改Dock首选项?

时间:2011-05-12 14:51:22

标签: objective-c cocoa macos desktop

我是Cocoa / macOS编程的新手。我刚刚发现NSUserDefaults可用于更改应用程序/系统设置,就像defaults命令的方式一样。

但我不知道如何更新这些设置。

例如,我使用NSUserDefaults将停靠码大小设置为32,并同步设置。但是码头保留了旧的设置。

即使我使用defaults write com.apple.dock tilesize 32更改其大小,在我退出并登录之前也不会更新。

是否有其他技术可以通知Dock以获取更新?我知道系统偏好设备可以做到这一点。

谢谢!

3 个答案:

答案 0 :(得分:3)

Mac OS X基座在重新启动之前不会重新加载其设置。与您必须通过终端(defaults write com.apple.dock tilesize 32; killall Dock)手动更改其设置的方式相同,您必须在代码中执行此操作。因此,当您编写代码的defaults部分时,您必须编写kill部分:

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

如果你想在不杀死码头的情况下这样做,抱歉,但你运气不好。虽然可能有一个隐藏的API强制Dock在运行中重新加载其设置,但在我的所有搜索中,我从未发现任何关于如何执行此操作的提示(隐藏的分布式通知中心上没有发布通知,大多数应用程序彼此互动)。

答案 1 :(得分:1)

借助Xcode调试器的神奇功能和一些格式化的反汇编,我创建了这个可以粘贴到代码中的短头文件(GitHub gist是here)。希望功能名称不言自明。

// TO USE THESE INTERFACES, you MUST link against ApplicationServices.framework.

#pragma once

#ifdef __cplusplus
extern "C" {
#endif

    // Boolean preferences
    extern void CoreDockSetLaunchAnimationsEnabled(bool enable);
    extern void CoreDockSetMagnificationEnabled(bool enable);
    extern void CoreDockSetAutoHideEnabled(bool enable);
    extern void CoreDockSetMinimizeInPlace(bool enable);

    // Sets other preferences such as whether the indicators below the app icons are shown
    // 'preferenceDict' is a CFDictionary containing a magic key value
    // Will require further inspection of Dock.prefpane to find all the keys
    // (I haven't noted them down)
    extern void CoreDockSetPreferences(CFDictionaryRef preferenceDict);

#ifdef __cplusplus
} // extern "C"
#endif

以这种方式更新的首选项会立即反映出来,因为这些函数实际上会在内部向“com.apple.dock”mach服务发送消息。
玩得开心!

请注意:这些是私有系统API。任何使用这些API 的提交到Mac App Store的应用都将被拒绝。另外,如果您没有App Store的意图,使用这些界面没有任何害处。它们似乎从Mac OS X的曙光开始就已存在,并且它们在不久的将来它们很可能会消失,如果有的话。

答案 2 :(得分:0)

您可以使用AppleScript通过脚本化系统偏好设置来设置Dock的某些属性,您可能需要查看是否可以采用该方法?也许从你的应用程序中调用一些AppleScript?