在 OS X 上使用 objc 最小化 Finder 窗口时遇到问题

Posted

技术标签:

【中文标题】在 OS X 上使用 objc 最小化 Finder 窗口时遇到问题【英文标题】:Trouble minimizing Finder windows using objc on OS X 【发布时间】:2016-09-15 16:47:13 【问题描述】:

我正在尝试在 OS X 中以编程方式最小化所有窗口 ...

我有这个示例代码,它适用于大多数打开的窗口, 但是 finder 和设置窗口会做一些奇怪的事情:

NSMutableArray *array = [NSMutableArray array];

NSMutableArray *windows = (NSMutableArray *)CFBridgingRelease(CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID));
for (NSDictionary *window in windows)

    NSNumber *name = [window objectForKey:@"kCGWindowOwnerName" ];
    NSNumber *number = [window objectForKey:@"kCGWindowOwnerPID" ];
    NSNumber *level = [window objectForKey:@"kCGWindowLayer" ];

    if ([level isEqual:@0])
    
        NSLog(@"Adding %@", name);
        [array addObject:number];
    


NSArray *apps = [NSArray arrayWithArray:[[NSWorkspace sharedWorkspace] runningApplications]];
for (NSRunningApplication *app in apps )

    if (app.activationPolicy == NSApplicationActivationPolicyRegular)
    
        if ([array containsObject:[NSNumber numberWithInteger:app.processIdentifier]])
        
            NSLog(@"Minimizing %@", app.bundleIdentifier);
            [app hide];
        
    

例如,如果您打开了 Xcode 和 safari,它们将最小化罚款, 大多数时候,但在 Finder 打开查看文件夹时,它会离开 它最大化。很奇怪的行为...

如果我们只打开 Safari,它就可以正常工作:

2016-09-18 18:51:36.842425 Show Desktop[1149:46155] Adding Safari
2016-09-18 18:51:36.852206 Show Desktop[1149:46155] Minimizing com.apple.Safari

如果我们同时拥有 Safari 和 Xcode(在顶部),它可以正常工作:

2016-09-18 18:52:10.371454 Show Desktop[1149:46155] Adding Xcode
2016-09-18 18:52:10.371510 Show Desktop[1149:46155] Adding Safari
2016-09-18 18:52:10.381079 Show Desktop[1149:46155] Minimizing com.apple.dt.Xcode
2016-09-18 18:52:10.382259 Show Desktop[1149:46155] Minimizing com.apple.Safari

如果我们同时拥有 Safari(在顶部)和 Xcode,有时它会失败, 我们最终会看到 Xcode 可见,但 Safari 是隐藏的:

2016-09-18 18:53:45.387255 Show Desktop[1149:46155] Adding Safari
2016-09-18 18:53:45.387312 Show Desktop[1149:46155] Adding Xcode
2016-09-18 18:53:45.397135 Show Desktop[1149:46155] Minimizing com.apple.dt.Xcode
2016-09-18 18:53:45.398143 Show Desktop[1149:46155] Minimizing com.apple.Safari

此外,每当我们打开 Finder(在某些文件等上)时, 它几乎永远不会工作,Finder 将始终保持可见:

2016-09-18 18:54:49.889837 Show Desktop[1149:46155] Adding Xcode
2016-09-18 18:54:49.889894 Show Desktop[1149:46155] Adding Safari
2016-09-18 18:54:49.889914 Show Desktop[1149:46155] Adding Finder
2016-09-18 18:54:49.891700 Show Desktop[1149:46155] Minimizing com.apple.finder
2016-09-18 18:54:49.900926 Show Desktop[1149:46155] Minimizing com.apple.dt.Xcode
2016-09-18 18:54:49.901736 Show Desktop[1149:46155] Minimizing com.apple.Safari

【问题讨论】:

您是要最小化窗口(黄色按钮)还是要隐藏所有应用程序? 我想最好将它们最小化,以在 OSX 中复制 Windows 的显示桌面功能,但我认为这不可能...... 虽然我从来没有弄清楚如何正确最小化 Finder(没有 objc 脚本),但我已经发布了一个 Show Desktop 应用程序,它可以最小化和恢复窗口,忽略任何打开的 Finder 窗口,它是免费的:itunes.apple.com/app/show-my-desktop/id1155368370 【参考方案1】:

实际上,一旦您弄清楚发生了什么,这种行为并没有那么奇怪。由于您的 [app hide] 隐藏了所有内容(包括您自己的应用程序),因此焦点会返回到 Finder,然后它会变为活动状态并且它的窗口变得可见。

如果您希望专注于您的应用并隐藏其他所有内容,这可能会起作用:

[[NSWorkspace sharedWorkspace] hideOtherApplications];

在处理应用程序窗口时,这些函数可能会有所帮助:

[_window performMiniaturize:self]; 
// miniaturizes app _window

[_window setIsVisible:false];
 // makes the app _window not visible

[_window orderOut:self];
// removes app _window from screen

在调用hideOtherApplications 后,所有这些函数都应隐藏/移除调用应用程序的窗口,同时保持其处于活动状态。当然,可能有更好的方法可以做到这一点,尽管这至少可以让您对 windows 发生的事情有所了解。

【讨论】:

那里发生了更多事情,我无法解释......(请参阅上面的更新帖子) 我忘了提到我的应用程序不可见,它作为代理运行,在启动时不可见 - 只能从菜单栏访问...

以上是关于在 OS X 上使用 objc 最小化 Finder 窗口时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

在最小化到停靠后恢复 Qt 应用程序,使用 OS X 上的停靠快捷方式

OS X快捷键小技巧

Python属性错误。"NoneType对象没有属性finde_all",一个表没有,另一个表没有。

架构 x86_64 的未定义符号:“_OBJC_CLASS_$_RCTImageLoader”

如何在 OS X 上使用 LaTeX

体系结构x86_64的未定义符号:“ _ OBJC_CLASS _ $ _ RCTImageLoader”