2010-12-19 10 views
6

Tengo un NSStatusItem que se muestra correctamente en la barra de menús. Uno de los elementos (cuando se hace clic) muestra una NSWindow modal desde mi aplicación, que está destinada a realizar una única tarea, luego desaparecer. (Por ejemplo, el usuario ingresa un pequeño fragmento de texto, hace clic en "Guardar" y la NSWindow modal desaparece.)Mostrando una NSWindow modal, sin activar las ventanas de la otra aplicación

El problema ocurre cuando la aplicación se ejecuta en segundo plano. La ventana modal aparece correctamente encima de la aplicación que se ejecuta en primer plano, pero cuando el usuario hace clic en el botón "Guardar", el resto de las ventanas de la aplicación también se activan. Esto no es deseable, ya que el usuario tiene que volver a hacer clic en la aplicación que estaba usando. (La destrucción de la conveniencia de la NSStatusItem.) Estoy mostrando la ventana modal usando:

[myWindow setFrame:finalRect display:YES animate:NO]; 
[myWindow setLevel:NSPopUpMenuWindowLevel]; 
[NSApp runModalForWindow:myWindow]; 

¿Hay alguna manera para evitar clics/eventos en mi ventana emergente desde provocando que el resto de la aplicación que se active? ¿O una forma de que NSApp sepa que este panel en particular no debería activar automáticamente el resto de la aplicación? ¡Gracias!

Respuesta

16

En lugar de crear un NSWindow, cree una NSPanel con el estilo NSNonactivatingPanelMask. A continuación, puede hacer los habituales makeKeyAndOrderFront: y orderOut: para mostrar/ocultar el panel según sea necesario.

+0

Funciona perfectamente (y simplemente), gracias! –

1

Una solución de Ken Thomases en la lista de cacao-dev hace un par de años parece aplicable también en este caso:

[[NSApplication sharedApplication] hide:self]; 
[[NSApplication sharedApplication] performSelector:@selector (unhideWithoutActivation) withObject:nil afterDelay:0.05]; 

que en teoría le dice a la aplicación para ocultarse y mostrar en la parte inferior de la pila de ventanas.

También puede interceptar el evento click del ratón y utilizar [NSApp preventWindowOrdering]

+0

Gracias, voy a darle una oportunidad y le permiten saber cómo funciona. –

+0

No, al hacer clic en cualquier parte de esa ventana todavía se muestran las ventanas de aplicaciones relacionadas al primer plano. –

0

Usted puede intentar algo como:

... 
if ([NSApp isHidden]) 
    [myWindow makeKeyAndOrderFront:self]; 
else 
    [NSApp runModalForWindow:myWindow]; 
... 

y cuando acabado:

... 
if ([NSApp isHidden]) 
    [myWindow orderOut:self]; 
else 
    [NSApp stopModal]; 
... 
Cuestiones relacionadas