2011-08-21 15 views
17

In un'applicazione Cocoa, c'è un modo per sapere se un'altra applicazione è attualmente in modalità a schermo intero?Mac OS X Lion: rileva se un'altra applicazione è in esecuzione in modalità a schermo intero?

La mia applicazione è configurata per essere visualizzata su tutti gli spazi e ascolta gli eventi mouseEntered per ordinarsi in primo piano.

Il problema è che quando un'altra app è in modalità schermo intero e l'utente capita di spostare il mouse attraverso l'area nera in cui si trova la finestra della mia app, viene portata in primo piano (accade con più monitor).

Ho visto solo il comportamento precedente con [self setCollectionBehavior: NSWindowCollectionBehaviorCanJoinAllSpaces]; abilitato.

Qui l'altro codice pertinente per la mia app.

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

controllare questi due link fuori - che possono dare un suggerimento: http://stackoverflow.com/questions/633086/detecting-fullscreen-on-mac E http: // StackOverflow .com/questions/6815917/how-to-know-if-a-nswindow-is-fullscreen-in-mac-os-x-lion – leanne

risposta

1

Hmm, hai escluso l'utilizzo di applescript/scriptingbridge? È possibile ottenere la dimensione di Windows da applescript e confrontarli con le dimensioni dello schermo. (o non sai su quale schermata è inserita una determinata app?)
Alcune app accessibili sono dotate di un attributo 'AXFullScreen' sulle loro finestre. Per esempio questo funziona per alcuni applicazioni:

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'azione reale sembra essere giù in carbonio ... MacWindows.h e CarbonEvents.h hanno riferimenti a "fullscreen" in loro.

Avrete bisogno di cercare questo però.

+0

Tutto ciò che puoi fare tramite AppleScript puoi farlo più velocemente nel codice nativo. Questo post del blog è informativo sull'accesso agli attributi AX nel codice: http://cocoatutorial.grapewave.com/tag/axuielementcopyattributevalue/ – ipmcc

1

Utilizzare le notifiche. Per esempio:

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

In realtà, probabilmente si vorrà utilizzare NSDistributedNotificationCenter invece, dal momento che attraversa i processi.

Stai aggiungendo il tuo oggetto come osservatore, in modo che quando qualcos'altro pubblichi una notifica che entrerà a pieno schermo, il tuo oggetto riceverà tale notifica.

Il selettore è il messaggio/metodo che si desidera chiamare dal processo di notifica.

Il parametro name è il nome effettivo della notifica. Questi sono standard, a meno che tu non dovessi creare una notifica personalizzata per qualcosa che useresti.

Il parametro oggetto consente di specificare da quale oggetto si desidera ricevere le notifiche. Dal momento che vuoi sapere quando QUALSIASI app sta andando a schermo intero, vorrai lasciare questo zero.

Ricordarsi di rimuovere l'oggetto come osservatore prima che sia stato rilasciato!

+0

Questo funzionerà solo per le applicazioni che diventano a schermo intero dopo l'avvio dell'applicazione. Se ci sono applicazioni a schermo intero in esecuzione all'avvio dell'applicazione, non invieranno nuove notifiche all'applicazione. – Kyle

+0

Sì, le notifiche precedenti non verranno inviate nuovamente all'app appena avviata. Quindi, vero, se Mark ha bisogno di sapere se altre app sono già aperte a schermo intero all'avvio della sua app, questo non sarà di aiuto. Ma una volta avviata la sua app, rileverà tutte le app che entrano in modalità a schermo intero da quel momento in avanti. – leanne

+0

Il comportamento della notifica è cambiato in Mountain Lion? Perché il tuo codice non mi darà alcuna notifica (con il centro distribuito). Quando imposto il parametro name su nil (per ricevere tutte le notifiche) ottengo solo "com.apple.HIToolbox.hideMenuBarShown" quando si accede alla modalità a schermo intero. –

1

metodi di cui sopra di registrazione per

"NSWindowWillEnterFullScreenNotification"

non funziona, essi possono essere utilizzati per notificare la propria app, il loro utilizzo non siamo in grado di rilevare se qualsiasi altra applicazione è in modalità a schermo intero o no.

Tuttavia dopo aver provato così tante opzioni trovato app rivelatore FullScreen a github questo collegamento utile ..:) :)

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

Problemi correlati