4 votes

My Mac Service désactive l'application de premier plan

J'ai écrit un service Cocoa dans une application Mac. Lorsque je suis dans une autre application et que je déclenche le service, même si le code du service est complètement vide :

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

... la fenêtre de cette application est désactivée et la mienne est avancée. Ceci est vrai même si mon application est configurée pour fonctionner en mode "dockless" (LSUIElement = false). La fenêtre de l'application d'avant-plan est désactivée même si mon application n'a pas sa propre fenêtre !

J'ai essayé de désactiver mon application dans le gestionnaire de services, sans succès. Cacher mon application depuis le gestionnaire de services semble fonctionner, mais seulement si l'utilisateur déclenche le service avec le menu contextuel, et non avec la combinaison de touches, et seulement si nous ne fonctionnons pas en mode dockless (je veux que mon application soit dockless).

Comment faire pour empêcher la désactivation de l'application de premier plan ou, au moins, pour pouvoir la réactiver ?

4voto

MattR Points 5388

Cette question date d'il y a 6 mois, donc vous avez probablement déjà résolu votre problème, mais au cas où cela vous serait utile...

J'ai résolu un problème similaire avec une application sur laquelle je travaille en observant les désactivations d'applications via NSWorkspace.

Vous pourriez avoir une propriété :

NSRunningApplication* _previousRunningApplication;

Et mettez à jour cette propriété en observant la notification 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;
}

Ensuite, lorsque votre application finit de s'exécuter, il suffit d'activer l'application précédemment active en utilisant :

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

S'il y a la moindre chance que cette dernière ligne soit appelée pendant que votre application n'est pas actif, alors il doit d'abord vérifier qu'il utilise [NSApp isActive] (ou vous pourriez déclencher un comportement surprenant, et ennuyeux, pour les utilisateurs...)

Si vous avez trouvé une solution plus simple, je serais intéressé de l'entendre.

Au cas où ce code serait utile à quelqu'un, j'ai créé une classe séparée pour gérer tout cela et je l'ai enregistré dans Github :

http://github.com/mjrit/MJRAppReactivation

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X