隐藏应用程序图标而不关闭它窗口

时间:2013-07-30 17:13:40

标签: macos cocoa user-experience macos-carbon dock

要隐藏应用程序图标,请使用以下代码:

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

此代码隐藏图标,但它也会关闭应用程序窗口。可以隐藏关闭主窗口的图标吗?

[self.window setCanHide:NO];

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

谢谢!

2 个答案:

答案 0 :(得分:1)

我不确定我在最后一句中理解你的意思“这不是一个解决方案,因为当用户选择从其他应用程序菜单应用程序中隐藏其他时,将不会被隐藏。”但是,如果您希望在浏览代码时窗口保持打开状态

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

你希望它在其他时候隐藏自己,你可以尝试使用

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

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

答案 1 :(得分:0)

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

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

// 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];
});