Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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
like image 268
Devonx25 Avatar asked Jul 01 '13 21:07

Devonx25


2 Answers

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
like image 147
Idle_Mind Avatar answered Sep 18 '22 22:09

Idle_Mind


Public Class Iconform

  Public Declare Auto Function SetCursorPos Lib "User32.dll" (ByVal X As Integer, ByVal Y As Integer) As Long

  Public Declare Auto Function GetCursorPos Lib "User32.dll" (ByRef lpPoint As Point) As Long

  Public Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)

  Public Const MOUSEEVENTF_LEFTDOWN = &H2 ' left button down

  Public Const MOUSEEVENTF_LEFTUP = &H4 ' left button up

  Public Const MOUSEEVENTF_MIDDLEDOWN = &H20 ' middle button down

  Public Const MOUSEEVENTF_MIDDLEUP = &H40 ' middle button up

  Public Const MOUSEEVENTF_RIGHTDOWN = &H8 ' right button down

  Public Const MOUSEEVENTF_RIGHTUP = &H10 ' right button up



  Private Sub NotifyIcon1_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.Click

    SettingsForm.Show()



  End Sub



  Private Sub OptionsToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OptionsToolStripMenuItem.Click

    SettingsForm.Show()

  End Sub



  Private Sub CloseToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CloseToolStripMenuItem.Click

    Me.Close()



  End Sub

  Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown

    Dim bHandled As Boolean = False

    Dim xPos As Integer = Windows.Forms.Cursor.Position.X.ToString

    Dim zPos As Integer = Windows.Forms.Cursor.Position.Y.ToString



    Select Case e.KeyCode

      Case Keys.Right

        Windows.Forms.Cursor.Position = New Point(xPos + 10, zPos)

      Case Keys.Left

        Windows.Forms.Cursor.Position = New Point(xPos - 10, zPos)

      Case Keys.Down

        Windows.Forms.Cursor.Position = New Point(xPos, zPos + 10)

      Case Keys.Up

        Windows.Forms.Cursor.Position = New Point(xPos, zPos - 10)

      Case Keys.D

        mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)







    End Select

  End Sub

End Class
like image 34
Juanjo Avatar answered Sep 18 '22 22:09

Juanjo