如何知道在双击标题栏时窗口是否可以最小化? [英] How to know if window is minimizable when titlebar was double clicked?

查看:378
本文介绍了如何知道在双击标题栏时窗口是否可以最小化?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

此图片来自SystemPreferences>外观



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



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



也许一个终端命令我可以管道或有可可API



回答(感谢NSGod)

/ p>

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

if([event clickCount] = 2){
//从系统偏好设置获取设置> 外观> 双击窗口标题栏以最小化
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 {//默认为aqua,(aqua is 1)
imageName = [imageName stringByAppendingFormat:@_ colorsryg];
}

这也是有帮助的:)



 

NSString * const MDAppleMiniaturizeOnDoubleClickKey = @AppleMiniaturizeOnDoubleClick;

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

NSNumber * miniaturize = [userDefaults
objectForKey:MDAppleMiniaturizeOnDoubleClickKey];

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

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



请注意,默认情况下,双击以最小化如果检查 AppleMiniaturizeOnDoubleClick 的存在并返回nil,则表示它已关闭。 (用户默认值只有在不同于默认值时才开始存储值)。



此键与Leopard中的相同,与Snow Leopard相同。



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



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


另外, NSGlobalDomain 不会转换为
。该方法的全局首选项。


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



应用程序:

 code> kCFPreferencesAnyApplication,
kCFPreferencesCurrentApplication

主机:

  kCFPreferencesAnyHost,
kCFPreferencesCurrentHost

用户:

  kCFPreferencesAnyUser,
kCFPreferencesCurrentUser

假定应用程序包标识符为com.markdouma.App和单个主机(根据您当前的网络位置,此示例不会更改)通常有8个位置,偏好信息可以存储在磁盘上。 (注意:显示的路径仅用于演示目的;确切的文件路径位置可能会更改)。这8个不同的位置产生于CFPreferences常量的不同组合:


/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)



〜/ Library / Preferences / .GlobalPreferences.plist
(kCFPreferencesAnyApplication,kCFPreferencesCurrentUser,
kCFPreferencesAnyHost)



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



〜/ Library / Preferences / ByHost / 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是唯一的合法(App-Store兼容)方式来实现OP的目标。如果还有其他更有效的方法,请详细说明。


This image is from SystemPreferences > Appearance

I want to know How do I get that value programmatically?

I ask because I am drawing a window with a customized titlebar and I want it to resemble (in behavior) as much as possible to normal (non-customized) cocoa windows.

Maybe a terminal command I can pipe or is there an cocoa API that does this?

EDIT:

Answer (thanks to 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];
        }
    }
}

Later I found that Appearance (Aqua/Graphite) can be found:

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"];
}

Which can be helpful too :)

解决方案

The way I would do it is probably read the value in from user defaults.

NSString * const MDAppleMiniaturizeOnDoubleClickKey = @"AppleMiniaturizeOnDoubleClick";

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

NSNumber *miniaturize = [userDefaults
                     objectForKey:MDAppleMiniaturizeOnDoubleClickKey];

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

(This preference setting is stored in the invisible .GlobalPreferences.plist in your ~/Library/Preferences/ folder).

Note that by default, the "double-click to minimize" option is turned off, so if you check for the presence of the AppleMiniaturizeOnDoubleClick and it returns nil, that means it is off. (User defaults only start to store values if they differ from the defaults).

This key is the same in Leopard as it is in Snow Leopard. (It hasn't changed in Lion or Mountain Lion either).

Of course, there is a secret (private) method in NSWindow, -(BOOL)_shouldMiniaturizeOnDoubleClick, but I wouldn't recommend using private methods.

[UPDATE] Regarding Catfish_Man's comment: you are correct in that the line [userDefaults addSuiteNamed:NSGlobalDomain]; is unnecessary, as NSUserDefaults already has the ability to read global preferences. (I modified the code above to reflect this).

"Additionally, NSGlobalDomain is not translated to .GlobalPreferences.plist for that method."

I'm not sure I follow you there. NSUserDefaults is built on top of CFPreferences which defines the following 6 constants:

Application:

 kCFPreferencesAnyApplication,
 kCFPreferencesCurrentApplication

Host:

 kCFPreferencesAnyHost,
 kCFPreferencesCurrentHost

User:

 kCFPreferencesAnyUser,
 kCFPreferencesCurrentUser

Given a fictional application bundle identifier of "com.markdouma.App" and a single host (based on your current network location that won't change for this example), there are generally 8 locations where preference information could be stored on your disk. (NOTE: The paths shown are for demonstration purposes only; the exact file path locations are subject to change). The 8 different locations arise from the different combination of the CFPreferences constants:

/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)

~/Library/Preferences/.GlobalPreferences.plist (kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesAnyHost)

~/Library/Preferences/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)

While NSUserDefaults can only write to the domain combination shown in italics, it automatically has read access to the domain combinations shown in bold. In other words, without having to do anything, I can automatically run the following code and print the results:

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"));

Running that code on my system prints the following results:

 AppleMiniaturizeOnDoubleClick == YES
 MultipleSessionEnabled == YES

This makes sense, since I have both Fast User Switching and Double-click to minimize options enabled. MultipleSessionsEnabled is stored in the local domain at /Library/Preferences/.GlobalPreferences.plist, and AppleMiniaturizeOnDoubleClick is stored in the user domain at ~/Library/Preferences/.GlobalPreferences.plist.

Sample project: NSUserDefaultsFinagler.zip

"Additionally additionally, that's slow. Please don't do this."

Sorry, but that makes no sense (assuming that we've agreed that we're no longer using addSuiteNamed:). User defaults are cached by the application, making calls take in the matter of milliseconds. Wouldn't there be little noticeable difference between asking user defaults for the value for a key that represents a local application value or one that represents a global value?

AFAIK, this is the only "legal" (App-store-compatible) way to achieve the OP's goal. If there's another more efficient means, then please elaborate.

这篇关于如何知道在双击标题栏时窗口是否可以最小化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆