ToolStrip иногда не реагирует на щелчок мышью - PullRequest
7 голосов
/ 23 января 2009

У меня есть приложение .NET 2.0 WinForms с ToolStrip в моей основной форме. Иногда значки ToolStrip не реагируют на первый щелчок мыши, поэтому мне приходится дважды щелкать значок. Это просто стандартная панель инструментов с несколькими значками и текстами всплывающих подсказок, я не делаю ничего особенного. Это часто встречается?

Ответы [ 4 ]

22 голосов
/ 12 декабря 2009

У меня была такая же проблема несколько раз назад, и я нашел решение в блоге Рика Брюстера . Идея состоит в том, чтобы перезаписать «WndProc» в производном классе ToolStripEx. Ядро этого решения выглядит так:

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;
    }
}
3 голосов
/ 23 января 2009

У меня было это в других средах разработки (VB6), и это произошло потому, что первый клик поглощался панелью инструментов для получения фокуса. Или, другими словами, панель инструментов не будет реагировать на нажатие , пока не получит фокус. Чтобы проверить это, попробуйте нажать на пустую часть панели инструментов, прежде чем нажать на кнопку. Если вам никогда не придется дважды нажимать на кнопку после нажатия на панели инструментов, то это может быть проблемой. Я думаю, что они меня обошли (и это было много лет назад, поэтому, пожалуйста, извините, взлом) было программно уделить внимание панели инструментов в событии MouseOver.

2 голосов
/ 11 ноября 2015

Вы можете создать свой собственный класс, который наследуется от ToolStrip, и использовать пользовательское свойство ClickThrough для включения или выключения поведения:

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 голос
/ 23 января 2009

Если у окна приложения нет фокуса, вам нужно дважды нажать кнопку ToolStrip. Первый щелчок устанавливает фокус на окне, второй вызывает событие щелчка. Это (к сожалению) поведение по умолчанию и оно разработано. Microsoft Word демонстрирует такое же поведение (хотя .NET ToolStrip - это не тот же элемент управления).

...