2012-06-06 15 views
5

Tengo un NSWindow transparente que sigue la pantalla del usuario a donde quiera que vaya (el NSWindow se queda en frente de cada aplicación, sin importar qué, incluso las aplicaciones de pantalla completa).
En ese NSWindow tengo un evento mouseDown que muestra una ventana emergente. Digamos que estoy en safari en modo de pantalla completa y tengo mi ventana al frente, hago clic en safari y vuelvo a hacer clic en mi ventana: no pasa nada, el mouseDown no ocurre. Tengo que volver a hacer clic para que se active el evento mouseDown.
¿Cómo puedo forzar que mi NSWindow esté siempre activo, así que no tengo que hacer clic 2 veces para activar el mouseDown cuando hago clic en una aplicación en segundo plano y vuelvo a hacer clic en mi ventana?
¡Gracias!¿Cómo forzar a NSWindow a estar siempre activo/enfocado?

+0

Sírvanse explicar con detalle en la transparencia de la ventana: no es totalmente transparente, es ¿eso? – Tim

+0

completamente transparente con una imagen –

Respuesta

2

Si agrega una instancia de NSButton sin bordes a la vista de su ventana y configura su imagen como la del botón (y como su imagen alternativa, para hacerlo más hermoso), funcionará de la caja: Simplemente conecte la acción del botón método para su delegado de aplicación (o el objeto donde desea procesar la acción de clic). Un clic en la imagen (es decir, el botón) activará el método de acción del botón, sin importar qué ventana esté activa.

+0

¡gracias! ¡eso funciona como yo quería! tan simple y no me di cuenta. –

2

no estoy seguro si esto es exactamente lo que quiere (no es exactamente una ventana de ajuste de ancho), pero, desde el documentation:

Por defecto, un evento de ratón hacia abajo en una ventana que no es la ventana clave , simplemente lleva la ventana hacia adelante y la convierte en clave; el evento no es enviado al objeto NSView sobre el que se produce el clic del mouse. El NSView puede reclamar un evento inicial de mouse, sin embargo, anulando acceptsFirstMouse: para devolver YES.

El argumento de este método es el caso ratón hacia abajo que se produjo en la ventana que no son clave, que el objeto vista puede examinar para determinar si desea recibir el evento de ratón y potencialmente convertirse primero en responder. Desea el comportamiento predeterminado de de este método en, por ejemplo, un control que afecta al objeto seleccionado en una ventana.

Sin embargo, en ciertos casos es adecuada para invalidar este comportamiento, tales como los controles que deben recibir mouseDown: mensajes incluso cuando la ventana está inactiva. Los ejemplos de controles que admiten este comportamiento de clic son los botones de la barra de título de una ventana.

o usted podría intentar tocar el violín con

- (void)sendEvent:(NSEvent *)theEvent 

y ver si se puede manejar eventos de una manera personalizada.

+0

Investigué un poco en la documentación pero no pude encontrar nada que funcionara:/ –

+0

¿Has intentado hacer -acceptsFirstMouse: return SÍ? Eso haría que los controles se puedan utilizar inmediatamente en su ventana, incluso si no es la clave, que suena como lo que quiere. – Vervious

+0

nop, no funciona como quiero. quiero que la ventana esté activa/enfocada todo el tiempo. –

-2

Creo que lo que realmente debe hacer es usar un NSPanel (una paleta flotante - un tipo especial de NSWindow) que hará exactamente lo que usted quiere de una manera consistente con el SO en lugar de tratar de combatir el comportamiento previsto.

Aquí está la documentación NSPanel:

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/nspanel_Class/Reference/Reference.html

Y aquí hay algo de información útil y concisa:

http://cocoadev.com/wiki/NSPanel

Por defecto, un NSPanel desaparecerá cuando la aplicación está inactiva, pero puede apagar esto

Pido disculpas por no haberlo expuesto más completamente ... presionado por el tiempo.

Editar:

Tenga en cuenta que es probable que pueda obtener su ventana se comporte como se desea simplemente:

"El NSView puede reclamar un evento inicial del ratón hacia abajo, sin embargo, por razones imperiosas acceptsFirstMouse: volver SÍ. "

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/EventOverview/HandlingMouseEvents/HandlingMouseEvents.html

Tendrá que hacer esto con cualquier subclase NSView omitir la "activación clic".

+0

se comporta como la ventana ns. tengo que tocarlo dos veces para enfocarme después de hacer clic en una ventana de fondo:/ –

+0

Ese es el comportamiento predeterminado que debes anular. Si observa el visor de caracteres del sistema, un NSPanel, acepta el primer clic y permanece al frente. Consulte los documentos aquí: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/EventOverview/HandlingMouseEvents/HandlingMouseEvents.html – podperson

1

Esto funcionó para mí, la esperanza de que será útil, esto mantendrá su ventana siempre encima de todas las aplicaciones

[self.window makeKeyAndOrderFront:nil]; 
[self.window setLevel:NSStatusWindowLevel]; 
Cuestiones relacionadas