2011-08-21 9 views
17

Dans une application Cocoa, existe-t-il un moyen de savoir si une autre application est actuellement en mode plein écran?Mac OS X Lion: détecter si une autre application s'exécute en mode plein écran?

Mon application est configurée pour apparaître sur tous les espaces et écoute les événements mouseEntered pour se placer au premier plan.

Problème: lorsqu'une autre application est en mode plein écran et que l'utilisateur déplace la souris sur la zone noire où se trouve la fenêtre de mon application, elle est placée au premier plan (avec plusieurs moniteurs).

J'ai seulement vu le comportement ci-dessus avec [self setCollectionBehavior: NSWindowCollectionBehaviorCanJoinAllSpaces]; permis.

Voici l'autre code pertinent pour mon application.

- (void) mouseEntered:(NSEvent *)theEvent 
{ 
    // Don't do this when another app is in full screen mode: 
    [[self window] orderFront:self]; 
} 
+0

Vérifiez ces deux liens out - ils peuvent vous donner un indice: http://stackoverflow.com/questions/633086/detecting-fullscreen-on-mac ET http: // stackoverflow .com/questions/6815917/how-to-know-if-a-nswindow-is-fullscreen-in-mac-os-x-lion – leanne

Répondre

1

Hmm, avez-vous exclu en utilisant applescript/scriptingbridge? Vous pouvez obtenir la taille des fenêtres à partir d'applescript et les comparer à la taille de l'écran. (ou vous ne savez pas sur quel écran une application donnée est activée?)
Certaines applications qui sont accessibles auront un attribut 'AXFullScreen' sur leurs fenêtres. Par exemple, cela fonctionne pour quelques applications:

tell application "System Events" 
    tell process "Pages" 
     repeat with myWin in windows 
      get value of attribute "AXFullScreen" of myWin 
     end repeat 
    end tell 
end tell 

L'action réelle semble être dans le carbone ... MacWindows.h et CarbonEvents.h ont des références à « FullScreen » en eux.

Cependant, vous aurez besoin de faire des recherches.

+0

Tout ce que vous pouvez faire via AppleScript, vous pouvez le faire plus rapidement en code natif. Cet article de blog est informatif sur le sujet de l'accès aux attributs AX dans le code: http://cocoatutorial.grapewave.com/tag/axuielementcopyattributevalue/ – ipmcc

1

Utilisez les notifications. Par exemple:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(willEnterFull:) 
              name:NSWindowWillEnterFullScreenNotification 
              object:nil]; 

En fait, vous voudrez probablement utiliser NSDistributedNotificationCenter à la place, car il va dans tous les processus.

Vous ajoutez votre objet en tant qu'observateur, de sorte que lorsque quelque chose d'autre envoie une notification indiquant qu'il passera en plein écran, votre objet recevra cette notification.

Le sélecteur est le message/la méthode que vous souhaitez appeler par le processus de notification.

Le paramètre name est le nom réel de la notification. Ce sont des standards, sauf si vous deviez créer une notification personnalisée pour quelque chose que vous utiliseriez.

Le paramètre object permet de spécifier de quel objet vous souhaitez recevoir des notifications. Puisque vous voulez savoir quand N'IMPORTE QUELLE application va en plein écran, vous voudriez laisser ce néant. N'oubliez pas de retirer votre objet en tant qu'observateur avant qu'il ne soit libéré!

+0

Cela ne fonctionnera que pour les applications qui deviennent en plein écran après le lancement de votre application. Si des applications en mode plein écran sont exécutées lors du lancement de votre application, elles n'enverront pas de nouvelles notifications à votre application. – Kyle

+0

Oui, les notifications préalables ne seront pas renvoyées à l'application qui vient d'être lancée. Donc, vrai, si Mark a besoin de savoir si d'autres applications sont déjà ouvertes en plein écran lorsque son application est lancée, alors cela ne va pas aider. Mais une fois son application lancée, elle détectera toutes les applications qui passeront en mode plein écran à partir de ce moment. – leanne

+0

Est-ce que le comportement de la notification a changé dans Mountain Lion? Parce que votre code ne me donnera aucune notification (avec le centre distribué). Lorsque je mets le paramètre name à zéro (pour recevoir toutes les notifications), je ne reçois que "com.apple.HIToolbox.hideMenuBarShown" en mode plein écran. –

1

Les méthodes ci-dessus mentionnées de l'enregistrement pour

« NSWindowWillEnterFullScreenNotification »

ne fonctionne pas, ils peuvent être utilisés pour notifier votre propre application, les utiliser, nous ne pouvons détecter si une autre application est en mode plein écran ou pas.

Cependant, après avoir essayé tant d'options trouvé application de détecteur FullScreen à github ce lien utile ..:) :)

https://github.com/shinypb/FullScreenDetector.git

Questions connexes