2011-08-21 21 views
17

En una aplicación Cocoa, ¿hay alguna manera de saber si otra aplicación está actualmente en modo de pantalla completa?Mac OS X Lion: detectar si se está ejecutando otra aplicación en modo de pantalla completa?

Mi aplicación está configurada para aparecer en todos los espacios y escucha los eventos mouseEntered para ordenarlos al frente.

El problema es que cuando otra aplicación está en modo de pantalla completa y el usuario mueve el mouse por el área negra donde se encuentra la ventana de mi aplicación, se pone al frente (sucede con varios monitores).

Solo he visto el comportamiento anterior con [self setCollectionBehavior: NSWindowCollectionBehaviorCanJoinAllSpaces]; activado.

Aquí el otro código relevante para mi aplicación.

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

comprobar estos dos enlaces de salida - que le puede dar una pista: http://stackoverflow.com/questions/633086/detecting-fullscreen-on-mac Y http: // stackoverflow .com/preguntas/6815917/cómo-a-saber-si-a-NSWindow-is-a pantalla completa-en-mac-os-x-león – leanne

Respuesta

1

Hmm, ¿ha descartado usar applescript/scriptingbridge? Puede obtener el tamaño de las ventanas de AppleScript y compararlas con el tamaño de la pantalla. (¿O no sabe en qué pantalla está una aplicación determinada?)
Ciertas aplicaciones que son accesibles tendrán un atributo 'AXFullScreen' en sus ventanas. Por ejemplo, esto funciona para algunas aplicaciones:

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 

La verdadera acción parece estar abajo en carbono ... MacWindows.h y CarbonEvents.h tienen referencias a "FullScreen" en ellos.

Tendrás que investigar esto sin embargo.

+0

Cualquier cosa que puede hacer a través de AppleScript que puede hacer más rápido en código nativo. Esta publicación de blog es informativa sobre el tema del acceso a los atributos de AX en el código: http://cocoatutorial.grapewave.com/tag/axuielementcopyattributevalue/ – ipmcc

1

Usar notificaciones. Por ejemplo:

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

En realidad, es probable que desee utilizar NSDistributedNotificationCenter lugar, ya que va a través de los procesos.

Está agregando su objeto como observador, de modo que cuando algo más publique una notificación de que ingrese a pantalla completa, su objeto recibirá esa notificación.

El selector es el mensaje/método que desea invocar mediante el proceso de notificación.

El parámetro de nombre es el nombre real de la notificación. Estos son estándares, a menos que crearas una notificación personalizada para algo que estarías usando.

El parámetro de objeto es para especificar de qué objeto desea recibir notificaciones. Como desea saber cuándo CUALQUIER aplicación está en pantalla completa, querrá dejar este nulo.

¡Recuerde eliminar su objeto como observador antes de desasignarlo!

+0

Esto solo funcionará para las aplicaciones que se convierten en pantalla completa después de que se haya lanzado su aplicación. Si hay aplicaciones de pantalla completa ejecutándose cuando se inicia su aplicación, no enviarán nuevas notificaciones a su aplicación. – Kyle

+0

Sí, las notificaciones anteriores no se volverán a enviar a la aplicación que acaba de iniciarse. Entonces, es cierto, si Mark necesita saber si otras aplicaciones ya están abiertas a pantalla completa cuando se lanza su aplicación, entonces esto no ayudará. Pero una vez que se lanza su aplicación, detectará cualquier aplicación que entre en modo pantalla completa a partir de ese momento. – leanne

+0

¿Cambió el comportamiento de notificación en Mountain Lion? Debido a que su código no me dará ninguna notificación (con el centro distribuido). Cuando configuro el parámetro name en nil (para recibir todas las notificaciones) solo obtengo "com.apple.HIToolbox.hideMenuBarShown" cuando ingreso al modo de pantalla completa. –

1

Los métodos antes mencionados de registro para

"NSWindowWillEnterFullScreenNotification"

no funciona, se pueden utilizar para notificar a su propia aplicación, su uso no puede detectar si cualquier otra aplicación está en modo de pantalla completa o no.

Sin embargo, después de probar tantas opciones descubrí la aplicación de detección FullScreen en github este útil enlace ..:) :)

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

Cuestiones relacionadas