My Mac Service отключает приложение переднего плана - PullRequest
4 голосов
/ 09 декабря 2011

Я написал Какао Сервис в приложении Mac. Когда я нахожусь в другом приложении и запускаю службу, даже если код службы полностью пуст:

- (void)doMyService:(NSPasteboard*)pasteboard
        userData:(NSString*)userData 
        error:(NSString**)error {
}

... окно этого приложения деактивировано, а мое выдвигается. Это верно, даже если мое приложение настроено для работы в режиме без док-станции (LSUIElement = false). Окно приложения переднего плана деактивируется, даже если у моего приложения нет собственного окна!

Я попытался деактивировать свое приложение в обработчике службы; неудачно. Кажется, работает скрытие моего приложения из обработчика службы, но только если пользователь запускает службу с помощью контекстного меню, а не сочетания клавиш, и только если мы не работаем в режиме без дока (я хочу, чтобы мое приложение было без дока) .

Как мне предотвратить деактивацию приложения переднего плана или, по крайней мере, его активировать?

1 Ответ

4 голосов
/ 15 июля 2012

ОК, этому вопросу 6 месяцев, поэтому вы, вероятно, уже решили свою проблему, но в случае, если это полезно ...

Я решил похожую проблему с приложением, над которым я работаю, наблюдая за деактивацией приложения через NSWorkspace.

Вы можете иметь свойство:

NSRunningApplication* _previousRunningApplication;

И обновите это свойство, наблюдая за NSWorkspaceDidDeactivateApplicationNotification

[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self
                                                       selector:@selector(anyApplicationDeactivated:)
                                                           name:NSWorkspaceDidDeactivateApplicationNotification
                                                         object:nil];


// Called when any running application deactivates
-(void)anyApplicationDeactivated:(NSNotification*) notification {
    NSRunningApplication* app = [notification.userInfo valueForKey:NSWorkspaceApplicationKey];
    _previousRunningApplication = app;
}

Затем, когда ваше приложение завершит работу, просто активируйте ранее активное приложение, используя:

// Activate the previously active application (if available)
[_previousRunningApplication activateWithOptions:0];

Если есть вероятность, что последняя строка может быть вызвана, пока ваше приложение не активно, то сначала следует проверить, использует ли оно [NSApp isActive] (или вы можете вызвать какое-то неожиданное и раздражающее поведение для пользователей ...)

Если бы вы нашли более простое решение, мне было бы интересно узнать об этом.

На случай, если этот код кому-нибудь пригодится, я создал отдельный класс для обработки всего этого и проверил его в Github:

http://github.com/mjrit/MJRAppReactivation

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...