Search code examples
vb.netmouseeventmouse

How to simulate mouse click?


I'm trying to make a program to click with keyboard like in Osu!.

I've tried SendKeys(), RaiseMouseEvent() and OnMouseClick(). Now I'm trying this and can't get anything to work.

The error I keep getting is:

PInvoke restriction: cannot return variants.

Public Class Form1
    Dim onn As Boolean = False
    Declare Function mc Lib "user32.dll" Alias "mouse_event" (flag, x, y, button, extra)
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If Not onn Then
            Button1.Text = "Off"
            Label1.Text = "Status: On"
            onn = True
        ElseIf onn Then
            Button1.Text = "On"
            Label1.Text = "Status: Off"
            onn = False
        End If
    End Sub
    Private Sub Form1_KeyPress1(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
        If onn And (e.KeyChar = "Z" Or e.KeyChar = "X" Or e.KeyChar = "z" Or e.KeyChar = "x") Then
            mc(&H2, 0, 0, 0, 0)
            mc(&H4, 0, 0, 0, 0)
        End If
    End Sub
End Class

Solution

  • This examples clicks where the mouse currently is when the feature is in the "onn" state:

    Public Class Form1
    
        Private onn As Boolean = False
    
        Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Integer, _
          ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Integer, _
          ByVal dwExtraInfo As Integer)
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Me.KeyPreview = True
            Button1.Text = "Off"
        End Sub
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            onn = Not onn
            Button1.Text = IIf(onn, "On", "Off")
        End Sub
    
        Private Sub Form1_KeyPress1(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
            If onn Then
                Select Case e.KeyChar
                    Case "Z", "z", "X", "x"
                        mouse_event(&H2, 0, 0, 0, 0)
                        mouse_event(&H4, 0, 0, 0, 0)
    
                End Select
            End If
        End Sub
    
        Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
            Debug.Print("Button2")
        End Sub
    
        Private Sub Button3_Click(sender As Object, e As System.EventArgs) Handles Button3.Click
            Debug.Print("Button3")
        End Sub
    
    End Class