双击标题栏时如何知道窗口是否可以最小化?

nac*_*o4d 7 cocoa window objective-c nsuserdefaults

此图像来自SystemPreferences> Appearance 在此输入图像描述

我想知道如何以编程方式获得该值?

我问,因为我正在绘制一个带有自定义标题栏的窗口,我希望它尽可能地与正常(非自定义)可可窗口相似(在行为上).

也许我可以管道的终端命令或是否有一个cocoa API来执行此操作?

编辑:

回答(感谢NSGod)

- (void)mouseUp:(NSEvent *)event{

    if ([event clickCount] == 2) {
        //Get settings from "System Preferences" >  "Appearance" > "Double-click on windows title bar to minimize"
        NSString *const MDAppleMiniaturizeOnDoubleClickKey = @"AppleMiniaturizeOnDoubleClick";
        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
        // [userDefaults addSuiteNamed:NSGlobalDomain]; // unnecessary
        BOOL shouldMiniaturize = [[userDefaults objectForKey:MDAppleMiniaturizeOnDoubleClickKey] boolValue];
        if (shouldMiniaturize) {
            [self miniaturize:self];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

后来我发现可以找到Appearance(Aqua/Graphite):

NSString * const kAppleAquaColorVariant = @"AppleAquaColorVariant";
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// [userDefaults addSuiteNamed:NSGlobalDomain]; // unnecessary  
NSNumber *color = [userDefaults objectForKey:kAppleAquaColorVariant];
if ([color intValue] == 6) {//graphite is 6 
    imageName = [imageName stringByAppendingFormat:@"_graphite"];
}else{//defaults to aqua, (aqua is 1)
    imageName = [imageName stringByAppendingFormat:@"_colorsryg"];
}
Run Code Online (Sandbox Code Playgroud)

哪个也有帮助:)

NSG*_*God 5

我这样做的方法可能是从用户默认值中读取值.

NSString * const MDAppleMiniaturizeOnDoubleClickKey = @"AppleMiniaturizeOnDoubleClick";

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// [userDefaults addSuiteNamed:NSGlobalDomain]; // unnecessary

NSNumber *miniaturize = [userDefaults
                     objectForKey:MDAppleMiniaturizeOnDoubleClickKey];

NSLog(@"AppleMiniaturizeOnDoubleClick == %@",
                ([miniaturize boolValue] ? @"YES" : @"NO"));
Run Code Online (Sandbox Code Playgroud)

(此首选项设置存储在.GlobalPreferences.plist〜/ Library/Preferences /文件夹中的不可见内容中).

请注意,默认情况下,"双击以最小化"选项处于关闭状态,因此,如果检查是否存在,AppleMiniaturizeOnDoubleClick则返回nil,这表示它已关闭.(如果用户默认值与默认值不同,则用户默认仅开始存储值).

这个关键在Leopard和Snow Leopard中是一样的.(它在Lion或Mountain Lion中也没有变化).

当然,还有一个秘密(私有)方法NSWindow,-(BOOL)_shouldMiniaturizeOnDoubleClick但我不建议使用私有方法.

[更新]关于Catfish_Man的评论:你是正确的[userDefaults addSuiteNamed:NSGlobalDomain];,因为NSUserDefaults已经能够读取全局首选项.(我修改了上面的代码以反映这一点).

"此外,NSGlobalDomain该方法未翻译为.GlobalPreferences.plist."

我不确定我会跟着你.NSUserDefaults建立在CFPreferences之上,它定义了以下6个常量:

应用:

 kCFPreferencesAnyApplication,
 kCFPreferencesCurrentApplication
Run Code Online (Sandbox Code Playgroud)

主办:

 kCFPreferencesAnyHost,
 kCFPreferencesCurrentHost
Run Code Online (Sandbox Code Playgroud)

用户:

 kCFPreferencesAnyUser,
 kCFPreferencesCurrentUser
Run Code Online (Sandbox Code Playgroud)

给定虚构的应用程序包标识符"com.markdouma.App"和单个主机(基于您当前的网络位置,此示例不会更改),通常有8个位置可以在磁盘上存储首选项信息.(注意:显示的路径仅用于演示目的;确切的文件路径位置可能会发生变化).8个不同的位置来自CFP参考常量的不同组合:

/Library/Preferences/.GlobalPreferences.plist (kCFPreferencesAnyApplication, kCFPreferencesAnyUser, kCFPreferencesAnyHost)

/Library/Preferences/com.markdouma.App.plist
(kCFPreferencesCurrentApplication, kCFPreferencesAnyUser, kCFPreferencesAnyHost)

/Library/Preferences/ByHost/.GlobalPreferences.UNIQUE_HOST_IDENTIFIER.plist (kCFPreferencesAnyApplication, kCFPreferencesAnyUser, kCFPreferencesCurrentHost)

/Library/Preferences/ByHost/com.markdouma.App.UNIQUE_HOST_IDENTIFIER.plist (kCFPreferencesCurrentApplication, kCFPreferencesAnyUser, kCFPreferencesCurrentHost)

〜/库/首选项/ .GlobalPreferences.plist (kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesAnyHost)

〜/库/首选项/ com.markdouma.App.plist (kCFPreferencesCurrentApplication, kCFPreferencesCurrentUser, kCFPreferencesAnyHost)

〜/库/首选项/ ByHost/.GlobalPreferences.UNIQUE_HOST_IDENTIFIER.plist (kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost)

〜/库/首选项/ ByHost/com.markdouma.App.UNIQUE_HOST_IDENTIFIER.plist (kCFPreferencesCurrentApplication, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost)

虽然NSUserDefaults只能写入斜体显示的域组合,但它自动具有以粗体显示的域组合的读访问权限.换句话说,无需执行任何操作,我可以自动运行以下代码并打印结果:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

NSNumber *miniaturize = [userDefaults
                 objectForKey:@"AppleMiniaturizeOnDoubleClick"];

NSNumber *fastUserSwitching = [userDefaults
                 objectForKey:@"MultipleSessionEnabled"];

NSLog(@"AppleMiniaturizeOnDoubleClick == %@",
            ([miniaturize boolValue] ? @"YES" : @"NO"));

NSLog(@"MultipleSessionEnabled == %@",
            ([fastUserSwitching boolValue] ? @"YES" : @"NO"));
Run Code Online (Sandbox Code Playgroud)

在我的系统上运行该代码将打印以下结果:

 AppleMiniaturizeOnDoubleClick == YES
 MultipleSessionEnabled == YES
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为我同时具有快速用户切换和双击以最小化启用的选项.MultipleSessionsEnabled存储在本地域中/Library/Preferences/.GlobalPreferences.plist,并AppleMiniaturizeOnDoubleClick存储在用户域中~/Library/Preferences/.GlobalPreferences.plist.

示例项目:NSUserDefaultsFinagler.zip

"另外,这很慢.请不要这样做."

对不起,但这没有任何意义(假设我们已经同意我们不再使用addSuiteNamed:).用户默认值由应用程序缓存,使得调用在几毫秒内完成.请求用户默认值代表本地应用程序值的键或代表全局值的键之间没有什么明显的区别?

AFAIK,这是实现OP目标的唯一"合法"(App-store兼容)方式.如果还有另一种更有效的方法,请详细说明.

  • [userDefaults addSuiteNamed:NSGlobalDomain]; 比无用更糟糕.全局域包含在NSUserDefaults的默认搜索列表中.此外,NSGlobalDomain未转换为该方法的.GlobalPreferences.plist.另外,这很慢.请不要这样做. (3认同)