【问题标题】:How do I detect a mouse click anywhere on a form in vb.net?如何在 vb.net 中检测表单上任意位置的鼠标单击?
【发布时间】:2016-06-05 04:28:36
【问题描述】:

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

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!Mouse_click.Form1::GetAsyncKeyState' 的调用导致堆栈不平衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。请检查调用约定和参数PInvoke 签名匹配目标非托管签名。"

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

【问题讨论】:

标签: vb.net


【解决方案1】:

有几种方法可以真正做到这一点,这取决于你到底想要完成什么。一种方法是有一个特定的位置来路由所有点击事件:

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

谢谢你,罗宾!完全脱离了我的脑海......

【讨论】:

  • 使用这种策略来防止在事件处理程序末尾不断添加 Thing.MouseClick 的替代方法是将这样的行放在单个块中 AddHandler Me.Thing.Click, AddressOf ClickHandler
  • 就是这样,非常感谢!!我已经习惯了 Python,在 Python 中测试鼠标点击事件要容易得多。干杯!
猜你喜欢
  • 1970-01-01
  • 2011-11-08
  • 2018-08-10
  • 1970-01-01
  • 2014-10-19
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
相关资源
最近更新 更多