Скрыть значок приложения, не закрывая его окно

Чтобы скрыть значок приложения, я использую этот код:

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

Этот код скрывает значок, но также закрывает окно приложения. Можно ли скрыть значок, не закрывая главное окно?

[self.window setCanHide:NO];

Это не решение, потому что когда пользователь выбирает Hide other из меню другого приложения, приложение не будет скрыто.

Спасибо!


person Nikolai Nagornyi    schedule 30.07.2013    source источник
comment
На самом деле это не закрытие окна, а скрытие всех окон приложения.   -  person Thomas Tempelmann    schedule 27.04.2021


Ответы (2)


Я не уверен, что понимаю, что вы имеете в виду в последнем предложении: «Это не решение, потому что, когда пользователь выбирает «Скрыть другое» в меню другого приложения, приложение не будет скрыто». Но если вы хотите, чтобы окно оставалось открытым, когда вы проходите код

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

И вы хотите, чтобы он скрывался в другое время, вы можете попробовать использовать

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

И после запуска кода для скрытия значка приложения используйте [yourWindow setCanHide:YES];, чтобы окно было скрыто во время других процессов. (Например, это может быть полезно, чтобы окно настроек не скрывалось при нажатии кнопки «Показать значок приложения», но при этом окно настроек должно скрываться при взаимодействии с другими окнами приложения.

person Elbimio    schedule 30.07.2013
comment
Я хотел знать, как создать обратный вызов для функции TransformProcessType. Скорее всего это невозможно. В соответствии с вашим ответом я делаю это: [самостоятельно выполнитьSelector:@selector(setSuppressHideWindows:) withObject:[NSNumber numberWithBool:YES] afterDelay:2]; - person Nikolai Nagornyi; 31.07.2013

Окна приложения не закрываются, а просто скрываются, потому что приложение скрывается.

Более чистое решение для скрытия значка приложения без скрытия окон — это то, что впоследствии показывает приложение. И чтобы предотвратить мерцание из-за скрытия, а затем отображения окон, он также временно отключает их скрытие:

// 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];
});
person Thomas Tempelmann    schedule 27.04.2021