2011-02-01 16 views
15

Estoy tratando de traer una nueva NSWindow en frente de todas las otras ventanas, pero no tener que tomar foco.Hacer NSWindow frontal pero no en foco

puedo hacer que aparezca delante, con especial atención a lo siguiente:

 
NSApplication *thisApp = [NSApplication sharedApplication]; 
[thisApp activateIgnoringOtherApps:YES]; 

[self makeKeyAndOrderFront:self]; 

Alguna pista sobre cómo hacer que aparece en la parte superior, pero no tomar el foco fuera de otra aplicación?

Respuesta

15

En lugar de makeKeyAndOrderFront:, intente Es orderFront: (docs)

+0

estoy obteniendo los mismos resultados ... los "activateIgnoringOtherApps: SÍ" se acaba tirando enfoque automáticamente lejos de todas las demás aplicaciones. Si elimino ese código, entonces la nueva ventana simplemente aparece detrás de otras ventanas, lo cual es extraño, porque los documentos dicen que "orderFront:" debería comportarse de la manera que estoy buscando. – redhotvengeance

+1

@ilollar quizás intente ['- (void) orderFrontRegardless'] (http://developer.apple.com/library/mac/#documentation/cocoa/Reference/ApplicationKit/Classes/NSWindow_Class/Reference/Reference.html) – cobbal

+0

Hmmm ... intenté eso también, todavía no tuve suerte. En teoría, las llamadas para orderFront y orderFrontRegardless son para ordenar ventanas dentro de la pila de visualización de la aplicación específica, no todas las ventanas abiertas, ¿verdad? – redhotvengeance

6

intentar algo como esto:

[window setLevel:NSScreenSaverWindowLevel + 1]; 
[window orderFront:nil]; 

Esto mostrará la ventana por encima de las ventanas de otra aplicación, pero sin que sea activo. No se puede mostrar una ventana con un nivel de ventana normal en la aplicación A frente a una ventana de la aplicación B, si la aplicación B es la aplicación activa. (Hay una buena razón para esto, por cierto).

Utilice este método con discreción. En muchos casos, es probable que viole las pautas de interfaz humana. Si se usa incorrectamente, puede tender a molestar a un usuario. (Por ejemplo, en mi prueba justo ahora, la ventana apareció directamente sobre la ubicación que estaba mirando en Safari. El hecho de que estaba en el camino de lo que estaba haciendo, pero tuvo la audacia de no convertirse clave, lo hizo aún más irritante. Si estuviera fuera del camino en una esquina de mi pantalla, podría ser una historia diferente).

+0

¡Bingo! Eso funciono. Estoy de acuerdo con sus preocupaciones ... esto puede ser algo muy peligroso de implementar si no se hace con cuidado. Prometo ser cuidadoso :) – redhotvengeance

+0

Descubrí mis problemas con "orderFrontRegardless" y opté por ir con ese método, ya que parece ser la forma más estándar de implementar esta funcionalidad. Sin embargo, su método es útil para saberlo. ¡Gracias por la ayuda! – redhotvengeance

4

La orden de los métodos de frente y el nivel para el protector de pantalla +1 no funcionó para mí. This answer de El-Kenny hicieron, sin embargo:

[yourPanel setLevel:kCGMaximumWindowLevel]; 
Cuestiones relacionadas