好的,所以我知道如何检查用户是否点击了某个特定对象,但是我真的不在乎用户点击的位置,我只需要知道他们是否点击了(无论是在实际表单上还是在一个或一个对象上)。我的代码是这样的:
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很新,所以文档对我没有帮助。 任何帮助都会很棒:)
答案 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
谢谢你,罗宾!完全逃脱了我的想法......