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?
Respuesta
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.
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#.
¿Eso significa que no hay forma de manejar el evento de mousedown ya que es por diseño? – Skoder
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
- 1. Combine NotifyIcon y ToolTip
- 2. ¿VBScript tiene un equivalente DateTime.TryParse?
- 3. ¿tiene jquery un equivalente de dojo.hitch()?
- 4. ¿Java tiene un equivalente de referencia constante?
- 5. ¿Python tiene un equivalente a 'cambiar'?
- 6. ¿Tiene Python un equivalente a java.lang.Math.nextUp?
- 7. Does powershell tiene un equivalente a popen?
- 8. ¿PHP tiene un equivalente al operador || =?
- 9. ¿Tiene Ruby/Rails un equivalente a ++?
- 10. ¿Mercurial tiene un equivalente a git clean?
- 11. ¿C# tiene un equivalente std :: nth_element?
- 12. Invocar el menú de contexto de NotifyIcon
- 13. mouseover while mousedown
- 14. ¿Cómo se garantiza que NotifyIcon desaparezca?
- 15. mouseDown: en un NSTextField personalizado dentro de un NSTableView
- 16. ¿Tiene Clojure un paquete de importación de Java equivalente? *?
- 17. ¿Tiene C# un equivalente de clase anidada estática de Java?
- 18. ¿Tiene PHP un equivalente de RequestDispatcher.forward de Java?
- 19. ¿ArrayObject de PHP tiene un equivalente de in_array?
- 20. ¿SQLAlchemy tiene un equivalente de get_or_create de Django?
- 21. ¿Tiene ActionScript un equivalente a un "volcado del núcleo"?
- 22. jQuery mousedown continua
- 23. ¿Mono tiene el equivalente de ILDASM?
- 24. ¿Django ORM tiene un equivalente al atributo híbrido de SQLAlchemy?
- 25. ¿Ruby tiene un method_missing equivalente para variables de instancia indefinidas?
- 26. ¿Chicken Scheme tiene un equivalente a los $ 0 de Perl?
- 27. ¿jQuery tiene un equivalente a Element.identify de Prototype?
- 28. ¿F # tiene un equivalente a la toma de Haskell?
- 29. ¿Tiene PHP un equivalente del #ifdef de C/C++?
- 30. ¿Tiene menos un equivalente al desplazamiento de vim?
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
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
¿Esto en [MSDN] (http://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon.mousedown.aspx) es totalmente inexacto? – Steve