Tengo una aplicación .NET 2.0 WinForms con una ToolStrip en mi formulario principal. A veces, los iconos de ToolStrip no responden al primer clic del mouse, por lo que tengo que hacer clic dos veces en el ícono. Es solo una ToolStrip estándar con varios iconos y textos de información sobre herramientas, no hago nada especial. ¿Es esto común?ToolStrip veces no responde a un clic del mouse
Respuesta
Si la ventana de la aplicación no tiene el foco, debe hacer clic dos veces en el botón ToolStrip. El primer clic establece el foco en la ventana, el segundo aumenta el evento de clic. Este es (desafortunadamente) el comportamiento predeterminado y es por diseño. Microsoft Word muestra el mismo comportamiento (aunque .NET ToolStrip no tiene el mismo control).
He tenido eso en otros entornos de desarrollo (VB6), y resultó ser porque el primer clic estaba siendo absorbido por la barra de herramientas para adquirir el foco. O, para decirlo de otra manera, la barra de herramientas no respondería a un clic en hasta que tuvo el foco. Para probar esto, intente hacer clic en una parte vacía de la barra de herramientas antes de hacer clic en el botón. Si nunca tiene que hacer clic dos veces en el botón después de hacer clic en la barra de herramientas, ese podría ser el problema. Creo que lo superaron (y esto fue hace unos años, así que disculpen el truco) fue programáticamente dar el foco a la barra de herramientas en el evento MouseOver.
Gracias, de todos modos parece que este no es mi caso. Si configuro el foco en otro control (digamos un botón fuera de ToolStrip) y luego hago clic en un botón ToolStrip, se acepta el clic. – user20353
Tuve el mismo problema algunas veces, y encontré una solución en Rick Brewster's blog. La idea es sobrescribir 'WndProc' en una clase derivada ToolStripEx. El núcleo de esta solución es el siguiente:
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == NativeConstants.WM_MOUSEACTIVATE &&
m.Result == (IntPtr)NativeConstants.MA_ACTIVATEANDEAT)
{
m.Result = (IntPtr)NativeConstants.MA_ACTIVATE;
}
}
Esto es perfecto, mejor que cualquiera de las alternativas que he probado. – user169771
Solución similar en: https://stackoverflow.com/a/4967537/767664 – Pedro77
Usted puede crear su propia clase que hereda de ToolStrip y el uso de una propiedad personalizada ClickThrough
para cambiar el comportamiento o desactivar:
Public Class ToolStripExtended : Inherits ToolStrip
Private Const WM_MOUSEACTIVATE As UInteger = &H21
Private Const MA_ACTIVATE As UInteger = 1
Private Const MA_ACTIVATEANDEAT As UInteger = 2
Private Const MA_NOACTIVATE As UInteger = 3
Private Const MA_NOACTIVATEANDEAT As UInteger = 4
Private _clickThrough As Boolean = False
Public Sub New()
MyBase.New()
End Sub
''' <summary>
''' Gets or sets whether the ToolStripEx honours item clicks when its containing form does
''' not have input focus.
''' </summary>
''' <remarks>
''' Default value is false, which is the same behaviour provided by the base ToolStrip class.
''' </remarks>
Public Property ClickThrough() As Boolean
Get
Return Me._clickThrough
End Get
Set(value As Boolean)
Me._clickThrough = value
End Set
End Property
Protected Overrides Sub WndProc(ByRef m As Message)
MyBase.WndProc(m)
If _clickThrough AndAlso m.Msg = WM_MOUSEACTIVATE AndAlso m.Result = New IntPtr(MA_ACTIVATEANDEAT) Then
m.Result = New IntPtr(MA_ACTIVATE)
End If
End Sub
End Class
- 1. Listview onItemClick veces no responde
- 2. Simular clic real del mouse
- 3. emacsclient no responde a los clics del ratón
- 4. Elemento CSS3 con opacidad: 0 (invisible) responde a los eventos del mouse
- 5. Agregar elementos a ToolStrip en RunTime
- 6. ¿Cómo simulamos un clic del mouse con Xlib/C?
- 7. teclado del simulador iOS 6 no responde
- 8. win32: simular un clic sin simular el movimiento del mouse?
- 9. ¿Es posible SIMULAR un clic del mouse con un mouse hacia abajo y hacia arriba?
- 10. Simular un clic del mouse en Flash mediante JavaScript
- 11. UIScrollView no responde a setZoomScale:
- 12. UIButton no responde al evento de clic en UITableViewCell
- 13. Cómo detectar si un clic() es un clic del mouse o se activa mediante algún código?
- 14. ¿Cuál es la diferencia entre un clic y un clic del mouse?
- 15. Liberando la captura del mouse y dejando que el clic del mouse pase
- 16. ¿Es posible enviar aEvent() un clic del mouse a un elemento <input type = text>?
- 17. ¿Cómo coloco un div junto a un clic del mouse usando JQuery?
- 18. SendInput no realiza clic en el botón del mouse a menos que mueva el cursor
- 19. Delgado no responde a SIGINT o SIGTERM
- 20. Deshabilitar el doble clic del mouse con javascript o jquery
- 21. Deshabilitar el clic del mouse cuando está fuera de div
- 22. ¿Cómo simulo un clic de mouse a través del terminal mac?
- 23. Google Map jQuery - obtener LatLng desde el clic del mouse
- 24. Textarea pierde el foco en el clic del mouse?
- 25. Cómo simular el clic del mouse con el control WebBrowser
- 26. Distinga entre hacer doble clic con el mouse y hacer clic con el mouse en wpf
- 27. Cambiar el cursor en WPF veces funciona, a veces no
- 28. Groovy hasProperty/responde a
- 29. Responde a applicationWillEnterForeground en un UIView
- 30. Evento de vinculación al clic derecho del mouse
Existe una diferencia entre MS Word y los botones .NET ToolStrip: cuando la aplicación de Word no tiene el foco, los menús y símbolos en Word no se resaltan con el cursor del mouse. Solo se resaltan cuando Word tiene el foco. Por otro lado, .NET ToolStrip resalta sus botones incluso cuando la aplicación no tiene el foco, simulando que un clic del mouse activaría el botón inmediatamente. –