none
你好,我创建了Windows窗体程序,窗体上有很多按键、文本框等控件,我希望用户不论何时按下鼠标右键,都执行同一过程。请问,除了分别编写每个控件和窗体的鼠标事件来达到这一目的外,有没有更简单的方法?比如像键盘事件那样,可以在发送到控件之前由窗体先拦截处理? RRS feed

  • 问题

  • 你好,我创建了Windows窗体程序,窗体上有很多按键、文本框等控件,我希望用户不论何时按下鼠标右键,都执行同一过程。请问,除了分别编写每个控件和窗体的鼠标事件来达到这一目的外,有没有更简单的方法?比如像键盘事件那样,可以在发送到控件之前由窗体先拦截处理?多谢了

     

    2007年8月2日 7:46

答案

  • 当我们在一个窗体上的空白处单击鼠标右键时,窗体收到WM_RBUTTONDOWN消息;当我们在窗体上一个子控件上,如TextBox或Button,窗体将收到WM_PARENTNOTIFY消息,并且这个WM_PARENTNOTIFY消息的WParam参数的低位两字节是 WM_RBUTTONDOWN。

    我们可以重写窗体的WndProc方法来截取这两个消息。以下是示例代码:

    Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


    End Sub

    Private WM_RBUTTONDOWN As Integer = &H204
    Private WM_PARENTNOTIFY As Integer = &H210

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    MyBase.WndProc(m)
    If (m.Msg = WM_RBUTTONDOWN) Then
    SayHello()
    ElseIf (m.Msg = WM_PARENTNOTIFY) Then

    Dim temp As Integer = (m.WParam.ToInt32() And &HFFFF)
    If (temp = WM_RBUTTONDOWN) Then
    SayHello()
    End If
    End If

    End Sub

    Private Sub SayHello()
    MsgBox("hello world!")
    End Sub
    End Class

     

    2007年8月2日 8:11