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

标签 objective-c cocoa window nsuserdefaults

这张图片来自系统偏好设置 > 外观 enter image description here

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

我问是因为我正在绘制一个带有自定义标题栏的窗口,我希望它(在行为上)尽可能类似于普通(非自定义) 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/

相关文章:

c# - 打开一个没有所有者的新表格?

javascript - 获取页面可滚动高度

iOS 索引 TableView 使用核心数据和排序 - 索引可以,但数据不行

ios - 应用程序在 iOS 5 中崩溃,但在 iOS 6 和 7 中运行良好

ios - 如何在iOS的AWS Lambda中发送请求 header 数据

macos - 为什么我的 cocoa 程序在启动期间获得 EXC_BAD_ACCESS?

objective-c - 核心图像 CIImage 8 位灰度

ios - 从 fourthviewcontroller objective-c 中的 firstviewcontroller 访问字符串

macos - 在 WebView 中捕获 mailto 链接

go - 检查进程是否有窗口