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

时间:2011-05-23 15:25:42

标签: objective-c cocoa window nsuserdefaults

此图片来自SystemPreferences>出现 enter image description here

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

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

也许我可以管道的终端命令或是否有可执行此操作的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];
        }
    }
}

后来我发现可以找到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"];
}

这也有帮助:)

1 个答案:

答案 0 :(得分:5)

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

NSString * const MDAppleMiniaturizeOnDoubleClickKey = @"AppleMiniaturizeOnDoubleClick";

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

NSNumber *miniaturize = [userDefaults
                     objectForKey:MDAppleMiniaturizeOnDoubleClickKey];

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

(此偏好设置存储在〜/ Library / Preferences /文件夹中的不可见.GlobalPreferences.plist中。)

请注意,默认情况下,“双击以最小化”选项已关闭,因此,如果您检查是否存在AppleMiniaturizeOnDoubleClick并且它返回nil,则表示它已关闭。 (如果用户默认值与默认值不同,则用户默认仅开始存储值。)

Leopard中的这个键与Snow Leopard中的相同。 (它在Lion或Mountain Lion中也没有变化)。

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

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

  

“此外,NSGlobalDomain未翻译为   .GlobalPreferences.plist用于该方法。“

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

应用:

 kCFPreferencesAnyApplication,
 kCFPreferencesCurrentApplication

主机:

 kCFPreferencesAnyHost,
 kCFPreferencesCurrentHost

用户:

 kCFPreferencesAnyUser,
 kCFPreferencesCurrentUser

给定虚构的应用程序包标识符“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)

     

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

     

〜/ Library / Preferences / 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"));

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

 AppleMiniaturizeOnDoubleClick == YES
 MultipleSessionEnabled == YES

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

示例项目:NSUserDefaultsFinagler.zip

  

“另外,这很慢。请不要这样做。”

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

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