Mausklick simulieren ohne Mausbewegung

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von GCAsk.

    Mausklick simulieren ohne Mausbewegung

    Hallo liebe Community,

    Ich bin gerade dabei in meinem Programm einen Mausklick zu simulieren es funktioniert auch alles soweit so gut nun möchte ich aber weiterhin am PC arbeiten und möchte deshalb nicht das mir die Maus immer weg gezogen wird.

    Ich habe es mit diesem Befehl probiert: (Visual Basic 2010 Express)

    VB.NET-Quellcode

    1. Private Declare Ansi Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Keys, ByVal lParam As Integer) As Integer
    2. Private Const WM_LBUTTONUP As Long = &H202
    3. Private Const WM_LBUTTONDOWN As Long = &H201
    4. Dim ClickPos As Integer = MakeDWord(80, 230)
    5. SendMessage(WindowHandle.Item(WindowToSendTo), WM_LBUTTONDOWN, Keys.LButton, ClickPos)
    6. SendMessage(WindowHandle.Item(WindowToSendTo), WM_LBUTTONUP, Keys.LButton, ClickPos)
    7. Private Function MakeDWord(ByVal LoWord As Integer, ByVal HiWord As Integer) As Integer
    8. MakeDWord = (HiWord * &H10000) Or (LoWord And &HFFFF&)
    9. End Function



    Nun habe ich das Problem das SendMessage unterstrichen wird und einen Fehler bringt.
    vorerst ist das Fenster mal nicht minimiert das wird mein nächstes Projekt aber erstmal zu dem Klick Problem ich hoffe ihr könnt mir helfen.

    Die Positionen ermittel ich übrigens über einen Timer

    Hier noch der bisherige Quellcode

    VB.NET-Quellcode

    1. 'Objekte Deklarieren
    2. Imports System.Runtime.InteropServices
    3. Public Class StartForm
    4. Public Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Integer, ByVal dwExtraInfo As Integer)
    5. Private Const MOUSEEVENTF_LEFTDOWN = &H2
    6. Private Const MOUSEEVENTF_LEFTUP = &H4
    7. 'Info Ausgeben
    8. Private Sub StartForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    9. Hilfe.Text = "F2 drücken um Koordinaten zu speichern."
    10. End Sub
    11. 'Koordinaten erkennen
    12. Private Sub Koordinaten_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Koordinaten.Tick
    13. X.Text = "X-Position " & MousePosition.X & " Pixel"
    14. Y.Text = "Y-Position " & MousePosition.Y & " Pixel"
    15. End Sub
    16. 'Tastendruck überwachung vom System
    17. <DllImport("user32.dll")> _
    18. Public Shared Function GetAsyncKeyState(ByVal vKey As System.Windows.Forms.Keys) As Short
    19. End Function
    20. Private Sub t_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles t.Tick
    21. If GetAsyncKeyState(Keys.F2) = -32767 Then
    22. PositionSaveX.Text = MousePosition.X
    23. PositionSaveY.Text = MousePosition.Y
    24. Koordinaten.Enabled = False
    25. X.Visible = False
    26. Y.Visible = False
    27. PositionSaveX.Visible = True
    28. PositionSaveY.Visible = True
    29. End If
    30. End Sub
    31. 'Timer für den Clicker
    32. Private Sub Clicker_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Clicker.Tick
    33. Clicker.Interval = ((IntervalBox.Text) * (1))
    34. If PositionSaveX.Visible = False Then
    35. MsgBox("Bitte speichern sie die Koordinaten!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "ERROR")
    36. Else
    37. Clicker.Enabled = True
    38. Cursor.Position = New Point(PositionSaveX.Text, PositionSaveY.Text)
    39. mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
    40. mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
    41. End If
    42. End Sub
    43. 'Start Button Klicken
    44. Private Sub Start_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Start.Click
    45. If IntervalBox.Text = ("") Then
    46. MsgBox("Bitte geben sie ihren Interval ein!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "ERROR")
    47. Else
    48. Clicker.Enabled = True
    49. Status.Text = "Gestartet"
    50. Status.Visible = True
    51. End If
    52. End Sub
    53. 'Stop Button klicken
    54. Private Sub StopClick_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StopClick.Click
    55. If IntervalBox.Text = ("") Then
    56. MsgBox("Bitte starten sie vorher den Clicker!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "ERROR")
    57. Else
    58. Status.Text = "Gestoppt"
    59. Status.Visible = True
    60. Clicker.Enabled = False
    61. Clicker.Interval = 1
    62. End If
    63. End Sub
    64. 'Login Button klicken
    65. Private Sub Login_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Login.Click
    66. BrowserOpen.Show()
    67. End Sub
    68. 'Beenden Button Klicken
    69. Private Sub Beenden_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Beenden.Click
    70. Me.Close()
    71. End Sub
    72. End Class


    Schon mal im voraus Vielen Dank für Eure Hilfe :)

    Mfg BadAng3lDoM

    BadAng3lDoM schrieb:

    und möchte deshalb nicht das mir die Maus immer weg gezogen wird.
    Habe ich Dich richtig verstanden:
    Du willst mit einem Deiner Programme automatisch per Maus in z.B. Excel rumklickern und gleichzeitig mit der handgeführten Maus im z.B. Mediaplayer?
    Das wird so nicht gehen, dafür ist das Betriebssystem nicht ausgeleg. ;(
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die einzige Lösung die mir eingefallen ist, ist seinen eigenen Maustreiber zu schreiben und dann dadurch die eigendlichen Benutzerbewegungen zu puffern (oder nur zu sperren), in der Zeit die Bewegung aus zu führen und dann wieder frei zu geben. Aber das ist Erstens mal wieder auf Grund von Malwaremissbrauch hier im Forum nicht "zugelassen" und Zweitens erfordert das Ganze Programmierkentnisse in C bzw. Assembler um den Treiber zu schreiben.

    Off Topic:
    Msgbox ist alter VB6 Code in .Net wird Messagebox.Show() verwendet.

    Lg Mokki
    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread

    Ja genau in die Richtung soll es funktionieren.
    Die Maus soll einfach einen klick in einer Form an bestimmten Koordinaten klicken ohne die Maus zu bewegen der klick sollte auch wirklich nur in dieser Form gemacht werden.
    Von mir aus kann der Cursor auch zwischengespeichert werden und nach dem klick zurück gesetzt werden aber selbst das weiß ich nicht wie ich es anstellen soll.

    Ich hab jetzt mal angenommen einen Browser offen und will ein Video in YouTube schauen.
    Das Fenster von meinem Programm ist genau hinter dem Video dann wird er ja bei dem klick das Video stoppen.
    Und genau das will ich verhindern er soll zwar an dieser Stelle klicken aber nur in der Form ohne irgendwas anderes zu bedienen und dabei die Maus an der Stelle lassen wo sie zurzeit ist.

    Danke für den off topic Tipp werde ich mir merken ;)
    Mfg BadAng3lDoM
    @BadAng3lDoM OK.
    Ich hab mal folgendes probiert. Mach Dir ne Form mit nem Button und nem Label, das Label protokolliert die Mausbewegung über der Form.
    Der Button-Click löst das Maus-Klick-Event auf den Koordinaten 100, 100 aus und restaurert den Mauszeiger.
    Löse das Button-Click-Event mit der Leertaste aus, da bleibt die Maus über der Form.
    Zum Test mach Dir ein weiteres Programm mit nur einem sehr großen Button, der eine MessageBox anzeigt.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. [/spoiler][spoiler]Public Class Form1
    2. Public Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Integer, ByVal dwExtraInfo As Integer)
    3. Private Const MOUSEEVENTF_LEFTDOWN = &H2
    4. Private Const MOUSEEVENTF_LEFTUP = &H4
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. Dim pt = Cursor.Position
    7. Dim x = 100
    8. Dim y = 100
    9. Cursor.Position = New System.Drawing.Point(x, y)
    10. mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
    11. mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
    12. Cursor.Position = pt
    13. End Sub
    14. Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles MyBase.MouseMove
    15. Label1.Text = e.Location.ToString
    16. End Sub
    17. End Class

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    BadAng3lDoM schrieb:

    Ich hab jetzt mal angenommen einen Browser offen und will ein Video in YouTube schauen.
    Das Fenster von meinem Programm ist genau hinter dem Video dann wird er ja bei dem klick das Video stoppen.
    Und genau das will ich verhindern er soll zwar an dieser Stelle klicken aber nur in der Form ohne irgendwas anderes zu bedienen und dabei die Maus an der Stelle lassen wo sie zurzeit ist.

    Wahrscheinlich ganz trivial - aber:
    Wäre da nicht optimal, einfach einen zweiten Monitor anzuschließen und auf diesem das Programm laufen zu lassen. Dein Programm kann dann den Mausklick genau dort simulieren, während du aber den Browser (und das YouTube Video) noch auf dem Hauptmonitor ansehen kannst.