Juni 27, 2022, 14:00:59

Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!


Maus bewegen und Mausklick simulieren

Begonnen von bungev, April 12, 2022, 13:49:45

⏪ vorheriges - nächstes ⏩

bungev

Hallo zusammen,

ich habe vor mit Access 2019, mir meine eigene Checkbox zu entwerfen bzw. die Anzeige etwas aufzuhübschen. Die Anzeige funktioniert soweit schon einmal super, was ich aber leider bisher nicht automatisch hinbekomme ist das Wechseln des Datensatzes.

Das ganze soll aktuell in einem Endlosformular passieren. Über ein Bildelement werte ich das Klicken aus und schalte hier eine verdeckte Checkbox (diese ist dann auch mit der Tabelle verbunden) immer in den gegenläufigen Zustand. Abhängig von dem Wert wird dann eine passende Grafik in die Bildelement angezeigt.

Mein Problem ist nun, dass ich immer nur den aktuellen Datensatz ändern kann, egal welches der Boxen ich anklicke. Erst wenn ich den Datensatz wechsle, dann ändere ich diesen Datensatz. Soweit logisch, da das Bildelement keinem Datensatz zugeordnet ist.

Jetzt kam mir die Idee, das ich mir doch nur die aktuelle Mausposition ermitteln und merken muss, dann daraus eine neue Position ansteuern muss, dann die linke Maustaste simuliere und den Mauszeiger auf die alte Position (welches ja der zu ändernde Datensatz ist) zurückstellen muss. Am Ende bekommt der Benutzer optisch nichts mit und der Datensatz wurde im Hintergrund gewechselt.

Jetzt habe ich aber ein Problem mit dem Setzen und dem Mausklicken. Das Ermitteln der aktuellen Cursorposition (Mausposition = Cursorposition?) per GetCursorPos habe ich soweit hinbekommen. Zu mindestens erhalte ich die xy-Werte. Was ich aber leider nicht hinbekomme ist das Neupositionieren des Mauszeigers und das Simulieren der linken Maustaste.


Option Compare Database
Public Declare Function GetCursorPos Lib "user32" (cPoint As POINTAPI) As Long
Public Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long

Public Type POINTAPI
    x As Long
    y As Long
End Type
Sub Neue_Checkbox_Datensatz_aktivieren(Optional Neue_Checkbox_Mausbewegen_X As Long = 100, Optional Neue_Checkbox_Mausbewegen_Y As Long = 0)
    ' Hier wird als erstes die aktuelle Mausposition ermittelt
    Dim tPoint As POINTAPI
    Dim x As Long
    x = GetCursorPos(tPoint)

    Dim aktX As Long
    Dim aktY As Long
    aktX = tPoint.x
    aktY = tPoint.y
    MsgBox "Cursor ist an Position:" & vbLf & aktX & "  " & aktY

    ' Jetzt den Mauszeiger auf die neue Position setzen
    Call Cursor_bewegen_nach(aktX + Neue_Checkbox_Mausbewegen_X, aktY + Neue_Checkbox_Mausbewegen_Y)

End Sub
Public Sub Cursor_bewegen_nach(NeuX As Long, NeuY As Long)
    Dim n As Long
    n = SetCursorPos(NeuX, NeuY)

    MsgBox "Cursor sollte an Position:" & vbLf & NeuX & "  " & NeuY & "  sein"
   
End Sub


Könntet Ihr mir bei meinem Problem helfen?

Schon einmal vielen Dank im Voraus.

Volker


Beaker s.a.

Hallo Volker,
Ich verstehe das ganze Gefrickel nicht.
Wenn du zwischen
Zitatschalte hier eine verdeckte Checkbox
und
ZitatAbhängig von dem Wert wird dann eine passende Grafik in die Bildelement angezeigt.
eine Zeile
Me.Dirty = Falseeinfügst, wird der DS gespeichert und bleibt der aktuelle.


gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

bungev

Hallo Markus888,

Vielen Dank für Deinen Tipp. Der Code scheint zu funktionieren, zu mindestens wenn ich das mit dem Rechtsklick teste. Das Drücken der linken Maustaste kann ich aktuell leider noch nicht testen, da ich hier zu erst die Maus an eine neue Stelle positionieren müsste per Code.

Hallo Beaker s.a.,

Vielen Dank auch an Dich für die Rückmeldung.

Ich will es noch einmal mit anderen Worten erklären: Ich habe in einer Tabelle unter anderem ein Ja/Nein-Feld. Die Datensätze aus dieser Tabelle werden in einem Endlosformular angezeigt. Damit nun die Anzeige optisch schöner ist, habe ich ein Bildelement eingefügt. Als Steuerelement wird eine Funktion aufgerufen und der Wert dieses Ja/Nein-Feldes übergeben. Diese Funktion wertet den übergebenen Wert aus und liefert mir den Dateipfad für die Grafik zurück die angezeigt werden soll (roter und grüner Kreis). Des weiteren besitzt das Bildelement beim klicken die Routine, dass Ja/Nein-Feld in den anderen Zustand zu ändern.

Jetzt komme ich zu meinem Problem: Durch die Endlosdarstellung kann ich ja auf jedes dieser Bildelemente klicken um den Wert zu ändern. Nur leider wird jetzt nicht der Datensatz geändert, auf den ich gerade geklickt habe, sondern der Datensatz der gerade der aktuelle ist. Erst wenn ich selber in den zu ändernden Datensatz klicke (also im Datensatzanzeiger links den Pfeil bekomme), kann ich den Datensatz richtig ändern.

Aufgrund dieser Tatsache, kann mir die Idee, dies doch Access vornehmen zu lassen. Da man ja mit getcursor die aktuelle Position auf dem Bildschirm ermitteln kann, halte ich diesen Punkt intern fest, würde dann einen Wert von der X Koordinate abziehen den Mauszeiger dort neu positionieren, einmal die linke Maustaste drücken lassen (hätte somit den Datensatz gewechselt) und würde dann wiederum den Mauszeiger auf die alte Position zurück versetzen. Da dies so schnell geht (hoffe ich zu mindestens), bekommt der Nutzer davon optisch kaum bis gar nichts mit.

Die bisherigen Vorschläge aus dem Internet bezüglich dem Positionieren des Mauszeiger haben bisher leider nicht den gewünschten Erfolg gebracht.

Daher fällt mir eigentlich jetzt nur noch das Setzen des Mauszeiger an die neue/alte Position.

Ich hoffe, dass ich jetzt mein Problem bzw. mein Wunsch etwas verständlicher dargestellt habe.

Freundliche Grüße

Volker

PhilS

Zitat von: bungev am April 13, 2022, 15:56:00Der Code scheint zu funktionieren, zu mindestens wenn ich das mit dem Rechtsklick teste. Das Drücken der linken Maustaste kann ich aktuell leider noch nicht testen, da ich hier zu erst die Maus an eine neue Stelle positionieren müsste per Code.
Die API mouse_event-Funktion hat doch Argumente für die Position des Mausklicks. D.h. du musst nicht den Mauszeiger positionieren, sondern der Masuklick erfolgt genau an die Position , die du angibst.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

markus888

Das Beispiel im Link ist nicht grade optimal, was den Wissenstransfer anbelangt.
Wenn du in die Doku schaust, dann findest du alle Details.

https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-mouse_event

Hab die Funktion noch nie eingesetzt, aber jetzt in der Doku gesehen, dass die Koordinaten relativ sind, außer man setzt das Flag entsprechend. Aber relativ ist in deinem Fall eh besser.

10 Jahre Access

Beaker s.a.

Hallo Volker,
Sorry, habe ich (mal wieder) zu kurz drüber nachgedacht  :-[
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

bungev

April 25, 2022, 11:38:32 #7 Letzte Bearbeitung: Mai 21, 2022, 14:30:54 von bungev
Hallo zusammen,

so, habe die Lösung für mich gefunden und auch mal zwei Video dazu gemacht.

Teil 1: https://youtu.be/-EUSZ6tthlQ (Hier gab es noch eine kleine Sache die mich gestört hat)
Teil 2: https://youtu.be/y0j0bqajjYE (Die ist hier nun auch gelöst)

Vielen Dank an alle.

Gruß

Volker