这张图片来自系统偏好设置 > 外观
我想知道如何以编程方式获取该值?
我问是因为我正在绘制一个带有自定义标题栏的窗口,我希望它(在行为上)尽可能类似于普通(非自定义) cocoa 窗口。
也许是我可以通过管道传输的终端命令,或者是否有可执行此操作的 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"];
}
这也很有用:)
最佳答案
我的做法可能是从用户默认值中读取值。
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
中有一个 secret (私有(private))方法,-(BOOL)_shouldMiniaturizeOnDoubleClick
,但我不建议使用私有(private)方法。
[更新] 关于 Catfish_Man 的评论:您是正确的,因为行 [userDefaults addSuiteNamed:NSGlobalDomain];
是不必要的,因为 NSUserDefaults 已经能够读取全局首选项。 (我修改了上面的代码以反射(reflect)这一点)。
"Additionally,
NSGlobalDomain
is not translated to .GlobalPreferences.plist for that method."
我不确定我是否跟着你到那里。 NSUserDefaults 建立在 CFPreferences 之上,它定义了以下 6 个常量:
应用:
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/.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
"Additionally additionally, that's slow. Please don't do this."
抱歉,但这没有意义(假设我们同意不再使用 addSuiteNamed:
)。用户默认值由应用程序缓存,使调用只需几毫秒。向用户询问代表本地应用程序值或代表全局值的键值的默认值之间不会有明显的区别吗?
据我所知,这是实现 OP 目标的唯一“合法”(应用商店兼容)方式。如果还有其他更有效的方法,请详细说明。
关于objective-c - 如何知道双击标题栏时窗口是否最小化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6099338/