Wie mache ich einen Mouseklick in Visual Basic

PInvokeStackImbalance wurde erkannt.
Message: Ein Aufruf an die PInvoke-Funktion „Geistmouse!WindowsApplication1.Form1::mouse_event“ hat das Gleichgewicht des Stapels gestört. Wahrscheinlich stimmt die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur überein. Überprüfen Sie, ob die Aufrufkonvention und die Parameter der PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen.

wird mir bei

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

angezeigt

vollständiger code ist

Public Class Form1
Private Declare Sub mouse_event Lib „user32“ ( _
ByVal dwFlags As Long, _
ByVal dx As Long, _
ByVal dy As Long, _
ByVal cButtons As Long, _
ByVal dwExtraInfo As Long)

Private Const MOUSEEVENTF_LEFTDOWN = &H2
Private Const MOUSEEVENTF_LEFTUP = &H4

Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
Me.Text = Cursor.Position.ToString
End Sub

Private Sub Button2_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button2.MouseMove
Me.Text = Cursor.Position.ToString
End Sub

Private Sub Button1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseMove
Me.Text = Cursor.Position.ToString
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Label1.Text = Cursor.Position.X.ToString
Label2.Text = Cursor.Position.Y.ToString

If CInt(Label1.Text) Me.Left + Button2.Left + (Button2.Width / 2)
Label1.Text = CStr(CInt(Label1.Text) - 1)
Cursor.Position = New Point(CInt(Label1.Text), CInt(Label2.Text))
Me.Refresh()
Loop

End If

If CInt(Label2.Text) Me.Top + Button2.Top + 25 + (Button2.Height / 2)
Label2.Text = CStr(CInt(Label2.Text) - 1)
Cursor.Position = New Point(CInt(Label1.Text), CInt(Label2.Text))
Me.Refresh()
Loop
End If

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

End Sub

Private Sub Form1_Move(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Move

Label3.Text = CStr(Me.Left + Button2.Left.ToString)
Label4.Text = CStr(Me.Left + Button2.Top.ToString)

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Button2.Text = CStr(CInt(Button2.Text) + 1)
End Sub
End Class

Was Mache ich Falsch

Hallo soulseak,

welche VB-Version benutzt du?
Wenn es .net ist, könntest du versuchen die unten aufgeführten long-Deklarationen durch integer oder int32 zu ersetzen.

Schöne Grüße
DannyT

Public Class Form1
Private Declare Sub mouse_event Lib „user32“ ( _
ByVal dwFlags As Long, _
ByVal dx As Long, _
ByVal dy As Long, _
ByVal cButtons As Long, _
ByVal dwExtraInfo As Long)

Hallo Soulseak,

deine Frage bezieht sich auf Visual Basic .NET
Das sind alle VB-Versionen ab 2002. Die Sprache wurde damals grundlegend verändert. Ich bin Experte für VB 6.0, heute auch Visual Basic Classic genannt - darauf baut auch bis heute noch VBA (MS Office) auf. Ich kann dir deshalb nicht wirklich weiterhelfen - Wende dich doch bitte an einen Experten aus der Kategorie .NET & C#.
Was mir zu deinem Problem einfallen würde:
Du hast ein Event Form_MouseMove deklariert und
setzt in einer Schleife sehr oft neue Cursor-Positionen. Jedes mal müsste eigentlich das MouseMove-Ereignis ausgeführt werden, die Events können aber erst bearbeitet werden, wenn deine Routine Button1_Click fertig ausgeführt wurde. Deshalb werden diese Aufträge alle auf einen Stapel gelegt, und wenn die Routine fertig ist der Reihe nach ausgeführt. Möglicherweise reicht der Stack-Memory aber nicht für alle Events. Eigentlich sollten die überschüssigen Events dann aber einfach unter den Tisch fallen. Bei mir werden z.B nur die letzten 1250 Events noch verarbeitet. Mit dieser ganzen managed/unmanaged Code und P/Invoke Geschichte könnte es unter .NET aber eventuell Schwierigkeiten geben.

Gruß Philipp