如何在vb.net中的表单上的任何位置检测到鼠标单击?

时间:2016-06-05 04:28:36

标签: vb.net

好的,所以我知道如何检查用户是否点击了某个特定对象,但是我真的不在乎用户点击的位置,我只需要知道他们是否点击了(无论是在实际表单上还是在一个或一个对象上)。我的代码是这样的:

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

    If GetAsyncKeyState(1) Then
        Label1.Text = "Left"
    Else
        Label1.Text = "Right"
    End If
End Sub

当我运行代码时,出现错误:

检测到PInvokeStackImbalance

“调用PInvoke函数'鼠标单击!Mouse_click.Form1 :: GetAsyncKeyState'使堆栈失衡。这可能是因为托管PInvoke签名与非托管目标签名不匹配。请检查调用约定和参数PInvoke签名与目标非托管签名匹配。“

我对vb.net很新,所以文档对我没有帮助。 任何帮助都会很棒:)

1 个答案:

答案 0 :(得分:0)

有几种方法可以做到这一点,这取决于你究竟想要完成什么。一种方法是拥有一个特定的地方,您可以路由所有点击事件:

Public Sub ClickHandler(sender As Object, e As MouseEventArgs) Handles Me.MouseClick, PictureBox1.MouseClick, Label1.MouseClick, Button1.MouseClick
    Label1.Text = String.Format("Clicked ""{0}"" with the {1} mouse button.", sender.name, e.Button.ToString.ToLower)
End Sub

注意此Sub处理的所有事件?如果你想确定按下了什么按钮,你可能会做这样的事情:

Select Case e.Button
    Case MouseButtons.Left
        Label1.Text = "Left"
    Case MouseButtons.Right
        Label1.Text = "Right"
    Case MouseButtons.Middle
        Label1.Text = "Middle"
    Case Else
        Label1.Text = "Some other button"
End Select

同样,这只是一种方式,对于充满控件或跨任何应用程序工作的大型应用程序而言并不是非常实用。这样的事情会更复杂,可能需要一个系统范围的钩子。

<强> [编辑]:
根据Robin的评论(顺便说一下,优秀的建议),您可以在单独的代码行中添加处理程序,以避免必须预先包含每个控件。事实上,如果您确实遵循了我真正喜欢的方法,那么您可以使用循环对表单上的每个控件执行此操作:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    For Each c As Control In Controls
        AddHandler c.MouseClick, AddressOf ClickHandler
    Next
End Sub

Private Sub ClickHandler(sender As Object, e As MouseEventArgs) Handles Me.MouseClick
    Label1.Text = String.Format("Clicked ""{0}"" with the {1} mouse button.", sender.name, e.Button.ToString.ToLower)

    Select Case e.Button
        Case MouseButtons.Left
            Label2.Text = "Left"
        Case MouseButtons.Right
            Label2.Text = "Right"
        Case MouseButtons.Middle
            Label2.Text = "Middle"
        Case Else
            Label2.Text = "Some other button"
    End Select
End Sub

谢谢你,罗宾!完全逃脱了我的想法......