2012-02-29 19 views
6

Tengo un NotifyIcon en la bandeja del sistema. ¿Cómo puedo detectar cuándo el usuario ha hecho clic izquierdo sobre él? Supuse que el evento MouseDown sería lo que quiero usar, pero solo se maneja con el botón derecho y con el botón central. Para el clic izquierdo, solo se dispara después de que el usuario lo haya soltado (dado que acaba de realizar un clic normal). ¿Hay alguna forma de obtener el evento MouseDown?¿NotifyIcon tiene un equivalente de MouseDown?

+1

Intenté varias cosas también. Me tienes curiosidad. Incluso instalé VS11 para probarlo allí también. Sin suerte. Casi creo que es un error. Espero que alguien tenga una respuesta también. – JimDel

+1

Creo que puede tener algo que ver con el hecho de que se puede arrastrar (que es manejado por Windows mismo en lugar de la aplicación). Tal vez el evento 'mousedown' está siendo absorbido por Windows en lugar de burbujear hacia la aplicación. – Skoder

+1

¿Esto en [MSDN] (http://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon.mousedown.aspx) es totalmente inexacto? – Steve

Respuesta

4

Esto es por diseño, el shell sintetiza el mensaje MouseDown del evento up. Verá por qué funciona de esta manera cuando hace clic y mantiene presionado el botón y luego comienza a arrastrar. Observe cómo aparece la ventana de desbordamiento del área de notificación y le permite arrastrar el icono para eliminarla del área visible. No puede funcionar en ambos sentidos.

Técnicamente, podría enlazar la ventana propiedad de Explorer.exe para descifrar los mensajes antes de que Explorer lo haga con SetWindowsHookEx(). Sin embargo, eso requiere un tipo de DLL que no se puede escribir en C#, debe ser inyectado en el Explorador. Muy desestabilizador y difícil de superar para la competencia que intenta hacer lo mismo. También el tipo de código que causa noches de insomnio para el equipo de aplicación de Microsoft.

3

Parece ser que la API de Win32 subyacente Shell_NotifyIcon envía un mensaje WM_LBUTTONDOWN cuando los usuarios clics el icono. De acuerdo con MSDN de todos modos.

El examen del código fuente de Windows Forms para NotifyIcon revela el manejo de eventos estándar del mouse hacia abajo, por lo que si el mensaje Win32 se enviaba a la hora "correcta" funcionaría como usted desea/espera.

Tengo que estar de acuerdo con un comentario anterior de que NotifyIcon se tragará WM_LBUTTONDOWN ya que tiene que hacer la captura del mouse para permitir al usuario arrastrar los íconos.

Es posible que this article sobre la creación de un icono de bandeja para WPF sea útil, ya que muestra cómo usar SetWindowsHookEx, etc., desde C#.

+0

¿Eso significa que no hay forma de manejar el evento de mousedown ya que es por diseño? – Skoder

+0

No creo que haya una manera fácil. Es posible enganchar los mensajes WM_XXX en un nivel bajo (en C++) antes de que la barra de tareas los maneje, pero hace mucho tiempo que no hago nada parecido. – Phil

Cuestiones relacionadas