2009-05-28 20 views
5

Tengo una aplicación que usa NotifyIcon en la bandeja para ocultar/restaurar la aplicación, así como avisos emergentes para el usuario de los eventos de la aplicación. Mi aplicación tiene una cola de notificaciones y utilizo el evento NotificationIcon.BalloonTipClosed para determinar cuándo restablecer el globo y mostrar la siguiente notificación (si hay una en la cola).¿Cómo puedo saber si una punta de Globo en la bandeja del sistema se ha cerrado?

Este método parece funcionar bien en las dos causas habituales (el usuario deja que el globo se cierre cuando se agota y el usuario hace clic en "X" en el globo para forzarlo), pero hay un tercer caso donde BalloonTipClosed doesn ' t ser llamado:

  1. globo de notificación aparece
  2. Si bien es visible, usuario hace clic en el icono de notificación para que aparezca el menú contextual, haciendo que el balón a desaparecer

el evento BalloonTipClosed doesn' t se activan en este instancia - me imagino que es un error en el marco (estoy usando 2.0), pero ¿alguien tiene una idea al respecto? Si no obtengo este evento, mi aplicación siempre piensa que hay un globo visible (tengo un booleano que impide que muestre varios globos a la vez), y nunca volverá a mostrar otro ícono, mientras esté en ejecución.

Respuesta

0

Esto es lo que terminé haciendo, aunque no me gusta especialmente esta solución. Agregué un segundo temporizador al formulario y lo configuré durante 10 segundos. Cuando aparece una notificación (cuando aparece una), comienzo el temporizador, y luego en BalloonTipClosed, lo detengo. Si el temporizador marca (lo que significa que BalloonTipClosed aún no se ha ejecutado), visualizo el próximo consejo manualmente.

El resultado es que si aún no se ha disparado, me ocupo de ello. Sin embargo, estoy abierto a mejores soluciones si alguien tiene una.

0

En el controlador de eventos para el evento BalloonTipClicked, verificaría si se hizo clic en el botón derecho del mouse y si se configuró el valor booleano en falso.

3

Esto pertenece a la respuesta de Aarons como comentario, pero no puedo comentar aún.

Si maneja los eventos BalloonTipClicked y MouseClick en NotifyIcon (así como también en BalloonTipClosed), puede capturar todas las formas en que se puede cerrar el globo. Lo único que debes tener en cuenta es que varios escenarios dispararán múltiples eventos, así que asegúrate de codificarlos (algo así como isClosed = true, y luego reinicia eso cuando se muestre un nuevo globo).

+0

El problema con esto es que, mientras pueda capturar un evento icon_click, y sé que el globo ha cerrado en ese momento, No estoy seguro de cuándo mostrar el siguiente globo. Mostrarlo de inmediato sería sobre cualquier cosa que el usuario esté haciendo allí. Podría hacerlo en un retraso después del clic, y esto todavía implica un temporizador, así que prefiero usar el temporizador en todas las instancias. – SqlRyan

+0

Buen punto. Asumiendo que lo único que el usuario puede 'hacer ahí abajo' es activar un menú contextual, si maneja los eventos de Apertura y Cerrado del menú y solo muestra el siguiente globo si el menú contextual no se está activando. Es posible que también desee tomar esa decisión según el elemento de menú que seleccione el usuario – Bob

0

Creo que este post de Raymond Chen sobre las notificaciones de globo puede ayudarle a: http://blogs.msdn.com/oldnewthing/archive/2009/05/04/9585032.aspx

+0

. Creo que esto es exactamente lo que me está sucediendo, pero Raymond está de acuerdo en que realmente no hay forma de saber si el globo está cerrado. Me parece que el evento BalloonTipClosed debe activarse si el globo está cerrado de alguna manera, pero no se dispara si cierras el globo haciendo clic en NotifyIcon, como creo que debería. Quizás voy a actualizar la versión de mi aplicación y ver si esto cambia el comportamiento. – SqlRyan

Cuestiones relacionadas