在Dock中隐藏应用程序图标而不关闭其窗口



要删除Dock中的应用程序图标,我使用以下代码:

ProcessSerialNumber psn = { 0, kCurrentProcess };
TransformProcessType(&psn, kProcessTransformToUIElementApplication);

此代码隐藏Dock中的图标,但也会关闭应用程序窗口。是否可以在不关闭主窗口的情况下隐藏图标?

[self.window setCanHide:NO];

这不是一个解决方案,因为当用户从另一个应用程序菜单中选择Hide Others时,应用程序将不会被隐藏。

我不确定我是否理解你在最后一句"这不是一个解决方案,因为当用户从另一个应用程序菜单中选择隐藏其他应用程序时,应用程序将不会被隐藏。"

ProcessSerialNumber psn = { 0, kCurrentProcess };
TransformProcessType(&psn, kProcessTransformToUIElementApplication);

如果你想让它在其他时候隐藏起来,你可以尝试使用

[yourWindow setCanHide:NO];
ProcessSerialNumber psn = { 0, kCurrentProcess };
TransformProcessType(&psn, kProcessTransformToUIElementApplication);

一旦运行了隐藏应用程序图标的代码,请使用[yourWindow setCanHide:YES];,以便在其他过程中隐藏该窗口。(例如,当您切换"显示应用程序图标"按钮时,这可能有助于防止首选项窗口隐藏,但当您与应用程序的其他窗口交互时,仍然需要隐藏首选项窗口。

应用程序的窗口并没有关闭,只是因为应用程序被隐藏了。

隐藏应用程序图标而不隐藏窗口的一个更干净的解决方案是这样,它会在之后取消隐藏应用程序。为了防止由于隐藏,然后取消隐藏窗口而导致的闪烁,它还暂时禁用了它们的隐藏:

// Disable our windows from getting hidden
NSMutableArray<NSWindow*> *windowsThatCanHide = [NSMutableArray array];
for (NSWindow *w in NSApp.windows.copy) {
    if (w.canHide) {
        [windowsThatCanHide addObject:w];
        w.canHide = NO;
    }
}
// Remove icon from Dock (Note: This also inevitably hides the menu bar!)
TransformProcessType(&psn, kProcessTransformToUIElementApplication);
// Re-activate this app and re-enable the hiding of windows.
dispatch_async(dispatch_get_main_queue(), ^{
    for (NSWindow *w in windowsThatCanHide) {
        w.canHide = YES;
    }
    [NSApp unhide:self];
});