【问题标题】:Handling a MouseDown Event Regardless Of The Control无论控件如何处理 MouseDown 事件
【发布时间】:2010-04-18 00:32:19
【问题描述】:

无论控件触发 mouseDown 事件,是否可以在 VB.Net (2008) 中处理 mouseDown 事件?基本上,我只想在“表单级别”捕获 mouseDown 事件,并且不想在每个控件中编写 mouseDown 事件处理程序。有没有办法做到这一点?

【问题讨论】:

标签: .net vb.net visual-studio-2008


【解决方案1】:

这很不寻常,您几乎总是真的关心单击了哪个特定控件。并有一个 MouseDown 事件,该事件根据单击的控件执行特定操作。但是您可以,您可以在输入事件被分派到控件本身之前捕获它们。您需要使用 IMessageFilter 接口。最好用代码示例来解释:

Public Class Form1
  Implements IMessageFilter

  Public Sub New()
    InitializeComponent()
    Application.AddMessageFilter(Me)
  End Sub

  Protected Overrides Sub OnFormClosed(ByVal e As System.Windows.Forms.FormClosedEventArgs)
    Application.RemoveMessageFilter(Me)
  End Sub

  Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) As Boolean Implements System.Windows.Forms.IMessageFilter.PreFilterMessage
    REM catch WM_LBUTTONDOWN
    If m.Msg = &H201 Then
      Dim pos As New Point(m.LParam.ToInt32())
      Dim ctl As Control = Control.FromHandle(m.HWnd)
      If ctl IsNot Nothing Then
        REM do something...
      End If
      REM next line is optional
      Return False
    End If
  End Function
End Class

请注意,此过滤器对您应用中的所有表单均有效。如果你想让它只特定于一个表单,你需要过滤 ctl 值。

【讨论】:

  • 我面临的问题是我正在使用自定义开发的控件。似乎由于某种原因,编写它的人没有处理 mouseDown 事件,因为当我为控件处理 mouseDown 事件时,该事件永远不会触发。
  • @GregH:敲响了警钟。我已经给了你一个解决方案:stackoverflow.com/questions/2609325/…
  • MouseDown 事件发生在 any 鼠标按钮上,而不仅仅是 LMB,因此也需要为此调整代码。
【解决方案2】:
Private Sub Form1_Load(ByVal sender As System.Object, _
                       ByVal e As System.EventArgs) Handles MyBase.Load
    'note - this will NOT work for containers i.e. tabcontrols, etc
    For Each c In Me.Controls
        Try
            AddHandler DirectCast(c, Control).MouseDown, AddressOf Global_MouseDown
        Catch ex As Exception
            Debug.WriteLine(ex.Message)
        End Try
    Next
End Sub

Private Sub Global_MouseDown(ByVal sender As Object, _
                              ByVal e As System.Windows.Forms.MouseEventArgs)
    Debug.WriteLine(DirectCast(sender, Control).Name)
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 2011-08-07
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    相关资源
    最近更新 更多