Mein Maus-Recorder funktioniert nur in X-Achse Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
Scr1pter
Posts: 1271
Joined: 06 Aug 2017, 08:21
Location: Germany

Mein Maus-Recorder funktioniert nur in X-Achse

07 Jan 2019, 18:28

Hi,

hab mir mit AHK einen Maus-Recorder programmiert.
Ja, es gibt sowas sicherlich schon, aber wenn ich etwas selber programmiere, ist der Lerneffekt wesentlich höher.

Mein Maus-Recorder funktioniert so:
1. Zielpunkt anklicken
2. Startpunkt anklicken
3. Zweiten Punkt anklicken
4. Letzten Punkt anklicken

AHK errechnet automatisch die Punkte, die sich zwischen Nr. 2 und dem letzten befindet (Interpolierung nennt man das glaub ich).
Ich möchte den für Drag and Drop nutzen.
(Hatte erst neulich ein Tutorial gesehen, in dem man alles einzeln ziehen musste - sowas ist natürlich gefundenes Fressen für alle AHK-Fans ;) )

Das Skript (beta - teilweise auch noch einige Zeilen, die zusammengefasst bzw. durch eine Variable ersetzt werden können):

Code: Select all

;Maus-Recorder
^+!F7:: ; Strg+Shift+Alt+F7
if recorder ; Falls Maus-Recorder bereits aktiv ist:
{
  Gui_Anweisungen(0, "", "", "", "") ; Gui ausblenden
  recorder := !recorder ; Recorder-Modus ausschalten (0)
  lbuttonZähler = 0 ; Zähler zurücksetzen
}
else ; Falls er nicht aktiv ist:
{
  recorder := !recorder ; Recorder-Modus einschalten (1)
  Gui_Anweisungen(1, "Maus-Recorder", "Schritt 1:", "Klick auf den Zielpunkt", "Strg+Shift+Alt+F7 zum Beenden") ; Gui ein bzw. ausblenden, Titel anzeigen, Anweisung anzeigen
}
return

#if recorder ; Wenn der Recorder-Modus aktiv ist:
#include Guis\Gui-Anweisungen.ahk ; GUI einbinden - Gui_Anweisungen - #FUNKTION#
lbutton::
ShowRipple(LeftClickRippleColor) ; Optisches Feedback
lbuttonZähler++ ; Zähler mit jedem Mausklick inkrementieren
if lbuttonZähler = 1 ; Erster Mausklick
{
  Gui_Text_Ändern("Schritt 2:", "schritte", "Klick auf den Startpunkt.", "anweisungen") ; Zeichenkette1, Textfeld1, Zeichenkette2, Textfeld2
  MouseGetPos, zielX, zielY ; Koordinaten des Zielpunkts ermitteln
}
if lbuttonZähler = 2 ; Zweiter Mausklick
{
  Gui_Text_Ändern("Schritt 3:", "schritte", "Klick auf den zweiten Punkt.", "anweisungen") ; Zeichenkette1, Textfeld1, Zeichenkette2, Textfeld2
  MouseGetPos, startX, startY ; Koordinaten des Startpunkts ermitteln
}
if lbuttonZähler = 3 ; Dritter Mausklick
{
  Gui_Text_Ändern("Letzter Schritt:", "schritte", "Klick auf den Endpunkt.", "anweisungen") ; Zeichenkette1, Textfeld1, Zeichenkette2, Textfeld2
  MouseGetPos, zweitesX, zweitesY ; Koordinaten des Zwischenpunktes ermitteln
  unterschiedX := zweitesX - startX ; Differenz aus Zwischenpunkt und Starpunkt ermitteln (x)
  unterschiedY := zweitesY - startY ; Differenz aus Zwischenpunkt und Starpunkt ermitteln (y)
}
if lbuttonZähler = 4 ; Letzter Mausklick
{
  SoundPlay, %A_ScriptDir%\Guis\SoundAn.wav ; Akustisches Feedback
  MouseGetPos, endeX, endeY ; Koordinaten des Endpunkts ermitteln
  Sleep, d
  vergleichX := endeX - startX ; Die x-Positionen von endeX und startX vergleichen, um zu ermitteln, ob sie auf einer Achse liegen oder nicht
  ;MsgBox, %vergleichX% ; Info-Message - KORREKT
  unterschiedEndeX := endeX - zweitesX ; Differenz aus Endpunkt und Zwischenpunkt ermitteln (x)
  unterschiedEndeY := endeY - zweitesY ; Differenz aus Endpunkt und Zwischenpunkt ermitteln (y)
  schritteX        := unterschiedEndeX / unterschiedX ; Anzahl Schritte, um auf den Endpunkt zu gelangen
  schritteX        := Round(schritteX) ; Auf die nächste Ganzzahl aufrunden
  schritteY        := unterschiedEndeY / unterschiedY ; Anzahl Schritte, um auf den Endpunkt zu gelangen
  schritteY        := Round(schritteY) ; Auf die nächste Ganzzahl aufrunden
  nächstesX        := unterschiedX + zweitesX ; Berechnen, wo die Position des nächsten Punkts liegt (x)
  nächstesY        := unterschiedY + zweitesY ; Berechnen, wo die Position des nächsten Punkts liegt (y)
  Sleep, 50
  MouseClickDrag, L, startX, startY, zielX, zielY ; Mauszeiger auf Anfangspunkt befördern, Linksklick halten, auf Zielpunkt setzen und loslassen
  Sleep, 50
  MouseClickDrag, L, zweitesX, zweitesY, zielX, zielY ; Mauszeiger auf Zweiten Punkt befördern, Linksklick halten, auf Zielpunkt setzen und loslassen
  Sleep, 50
  if vergleichX between -40 and 40 ; Falls die 2 Punkte auf der gleichen Y-Achse liegen (+-40 px Toleranz im X-Bereich):
  {
    Loop, %schritteY% ; So oft wiederholen wie die Anzahl ermittelter Schritte
    {
      ;MsgBox, Y-Achse ; Info-Message - KORREKT
      MouseClickDrag, L, nächstesY, startX, zielX, zielY ; Mauszeiger auf nächsten Punkt befördern (in Y-Achse), Linksklick halten, auf Zielpunkt setzen und loslassen
      Sleep, 50
      nächstesY := nächstesY + unterschiedY ; Die Position des nächsten Punkts ermitteln (in Y-Achse)
      Sleep, d
    }    
  }
  else ; Ansonsten liegen sie auf der X-Achse
  {
    Loop, %schritteX% ; So oft wiederholen wie die Anzahl ermittelter Schritte
    {
      ;MsgBox, X-Achse ; Info-Message - KORREKT
      MouseClickDrag, L, nächstesX, startY, zielX, zielY ; Mauszeiger auf nächsten Punkt befördern (in Y-Achse), Linksklick halten, auf Zielpunkt setzen und loslassen
      Sleep, 50
      nächstesX := nächstesX + unterschiedX ; Die Position des nächsten Punkts ermitteln (in X-Achse)
      Sleep, d
    }
  }
  Gui_Anweisungen(0, "", "", "", "") ; Gui ausblenden 
  lbuttonZähler = 0 ; Zähler zurücksetzen
  recorder := !recorder ; Recorder-Modus verlassen - Maustaste wieder freigeben
}
return
#if ; #if-Block schließen
Nun das Problem:
Es funktioniert nur, wenn die Punkte 1, 2, 3 usw. auf der X-Achse liegen.
Befinden sie sich auf der Y-Achse, geht der Mauszeiger ebenfalls in die X-Achse, statt in die Y-Achse.

So sieht's aus, wenn ich es für die X-Achse verwende:
Image

Trotz mehrmaligen Lesens komme ich nicht auf den Fehler.

Danke für jede Hilfe.

Grüße
Please use [code][/code] when posting code!
Keyboard: Logitech G PRO - Mouse: Logitech G502 LS - OS: Windows 10 Pro 64 Bit - AHK version: 1.1.33.09
User avatar
SL5
Posts: 879
Joined: 12 May 2015, 02:10
Contact:

Re: Mein Maus-Recorder funktioniert nur in X-Achse

08 Jan 2019, 01:40

erstmal Kompliment :-)
ich finde es sehr gut lesbar.
jedenfalls würde ich Sachen wie umlaute in Variablennamen (alte Angewohnheit) unbedingt vermeiden.
nächstesX in naechstesX
wahrscheinlich hat das keinen effekt, aber wenigstens variabneln sollten in jedem textformat stabil bleiben.
nur so. leider hab ich deinen fehler nicht gefunden. hab auch nur drüber geschaut.

eine idee hab ich noch:
wie wärs viele logging ausgaben zu schreiben?
oder einen debugger zu verwenden und dann schritt für schritt durch?
ich selber nutze debugger für ahk derzeit nicht aber ein gutes log. vielleicht interessant: https://github.com/sl5net/global-Intell ... nc.ahk#L74
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Mein Maus-Recorder funktioniert nur in X-Achse  Topic is solved

08 Jan 2019, 11:33

Moin,

Code: Select all

      MouseClickDrag, L, nächstesY, startX, zielX, zielY ; Mauszeiger auf nächsten Punkt befördern (in Y-Achse), Linksklick halten, auf Zielpunkt setzen und loslassen
Das sieht so aus, als würde die Reihenfolge der Parameter nicht stimmen:
MouseClickDrag, WelcheTaste, X1, Y1, X2, Y2 , [Tempo, Relativ]
User avatar
Scr1pter
Posts: 1271
Joined: 06 Aug 2017, 08:21
Location: Germany

Re: Mein Maus-Recorder funktioniert nur in X-Achse

08 Jan 2019, 13:42

Hallo ihr Zwei,

ich danke euch beiden für euern Input.
Die wichtigste Nachricht: Es funktioniert jetzt :thumbup:
Um ehrlich zu sein war ich bei dieser Zeile auch etwas skeptisch (bereits während des Programmierens.)

@just me:
Hattest 100% Recht mit deiner Annahme!

@SL5:
Danke für die netten Worte!
Als ich mit AHK anfing, war Struktur ein Fremdwort.
Ich musste dann irgendwann selber lernen, dass ich so keinen Erfolg haben werde, wenn die Skripte etwas komplexer und sicherer sein sollen.

Debuggen ist natürlich hohe Schule (für mich jedenfalls).
Die von dir verlinkte Seite hab ich mir angeschaut - bisher kann ich aber noch nichts groß dazu sagen.
Was ich jedenfalls immer tue, ist es, mir MessageBoxes anzeigen zu lassen.
Eventuell wäre das auch eine Idee für meine nächste Gui:
- Werte von Variablen unter einander zu schreiben - im Prinzip wie eine LOG (was du ja erwähnt hast)

Bei der Sache mit den Umlauten gebe ich dir Recht, werde mir diese abgewöhnen.
Zu 95% bin ich eh im Haupt-Forum unterwegs, und da schreibe ich auch 99% auf Englisch (auch die Kommentare).

--------------------------------------------------------

Der Code sieht jetzt so aus und er funktioniert.
(Hab ihn auch etwas abspecken können):

Code: Select all

;Maus-Recorder
^+!F1:: ; Strg+Shift+Alt+F1
if recorder ; Falls Maus-Recorder bereits aktiv ist:
{
  Gui_Anweisungen(0, "", "", "", "") ; Gui ausblenden
  recorder := !recorder ; Recorder-Modus ausschalten (0)
  lbuttonZaehler = 0 ; Zähler zurücksetzen
}
else ; Falls er nicht aktiv ist:
{
  recorder := !recorder ; Recorder-Modus einschalten (1)
  Gui_Anweisungen(1, "Maus-Recorder", "Schritt 1:", "Klick auf den Zielpunkt", "Strg+Shift+Alt+F7 zum Beenden") ; Gui ein bzw. ausblenden, Titel anzeigen, Anweisung anzeigen
}
return

#if recorder ; Wenn der Recorder-Modus aktiv ist:
#include Guis\Gui-Anweisungen.ahk ; GUI einbinden - Gui_Anweisungen - #FUNKTION#
lbutton::
ShowRipple(LeftClickRippleColor) ; Optisches Feedback
lbuttonZaehler++ ; Zaehler mit jedem Mausklick inkrementieren
if lbuttonZaehler = 1 ; Erster Mausklick
{
  Gui_Text_Aendern("Schritt 2:", "schritte", "Klick auf den Startpunkt.", "anweisungen") ; Zeichenkette1, Textfeld1, Zeichenkette2, Textfeld2
  MouseGetPos, zielX, zielY ; Koordinaten des Zielpunkts ermitteln
}
if lbuttonZaehler = 2 ; Zweiter Mausklick
{
  Gui_Text_Aendern("Schritt 3:", "schritte", "Klick auf den zweiten Punkt.", "anweisungen") ; Zeichenkette1, Textfeld1, Zeichenkette2, Textfeld2
  MouseGetPos, startX, startY ; Koordinaten des Startpunkts ermitteln
}
if lbuttonZaehler = 3 ; Dritter Mausklick
{
  Gui_Text_Aendern("Letzter Schritt:", "schritte", "Klick auf den Endpunkt.", "anweisungen") ; Zeichenkette1, Textfeld1, Zeichenkette2, Textfeld2
  MouseGetPos, zweitesX, zweitesY ; Koordinaten des Zwischenpunktes ermitteln
  unterschiedX := zweitesX - startX ; Differenz aus Zwischenpunkt und Starpunkt ermitteln (x)
  unterschiedY := zweitesY - startY ; Differenz aus Zwischenpunkt und Starpunkt ermitteln (y)
}
if lbuttonZaehler = 4 ; Letzter Mausklick
{
  SoundPlay, %A_ScriptDir%\Guis\SoundAn.wav ; Akustisches Feedback
  MouseGetPos, endeX, endeY ; Koordinaten des Endpunkts ermitteln
  Sleep, d
  vergleichX := endeX - startX ; Die x-Positionen von endeX und startX vergleichen, um zu ermitteln, ob sie auf einer Achse liegen oder nicht
  if vergleichX between -40 and 40 ; Falls die 2 Punkte auf der gleicher Y-Achse liegen (+-40 px Toleranz im X-Bereich):
  {
    achse = Y ; Elemente befinden sich auf gleicher Y-Achse
  }
  else
  {
    achse = X ; Elemente befinden sich auf gleicher X-Achse
  }
  unterschiedEnde%achse% := ende%achse% - zweites%achse% ; Differenz aus Endpunkt und Zwischenpunkt ermitteln (x)
  schritte               := unterschiedEnde%achse% / unterschied%achse% ; Anzahl Schritte, um auf den Endpunkt zu gelangen
  schritte               := Round(schritte) ; Auf die nächste Ganzzahl aufrunden
  naechstes%achse%       := unterschied%achse% + zweites%achse% ; Berechnen, wo die Position des nächsten Punkts liegt (x)
  Sleep, 50
  MouseClickDrag, L, startX, startY, zielX, zielY ; Mauszeiger auf Anfangspunkt befördern, Linksklick halten, auf Zielpunkt setzen und loslassen
  Sleep, 50
  MouseClickDrag, L, zweitesX, zweitesY, zielX, zielY ; Mauszeiger auf zweiten Punkt befördern, Linksklick halten, auf Zielpunkt setzen und loslassen
  Sleep, 50
  Loop, %schritte% ; So oft wiederholen wie die Anzahl ermittelter Schritte
  {
    if achse = X ; Falls sich die Elemente auf der gleichen X-Achse befinden:
    {
      MouseClickDrag, L, naechstesX, startY, zielX, zielY ; Mauszeiger auf nächsten Punkt befördern (in X-Achse), Linksklick halten, auf Zielpunkt setzen und loslassen
    }
    else ; Ansonsten liegen sie auf der gleichen Y-Achse:
    {
      MouseClickDrag, L, startX, naechstesY, zielX, zielY ; Mauszeiger auf nächsten Punkt befördern (in Y-Achse), Linksklick halten, auf Zielpunkt setzen und loslassen
    }
    Sleep, 50
    naechstes%achse% := naechstes%achse% + unterschied%achse% ; Die Position des nächsten Punkts ermitteln
    Sleep, d
  }
  Gui_Anweisungen(0, "", "", "", "") ; Gui ausblenden 
  lbuttonZaehler = 0 ; Zaehler zurücksetzen
  recorder := !recorder ; Recorder-Modus verlassen - Maustaste wieder freigeben
}
return
#if ; #if-Block schließen
Hatte auch die Idee gehabt, innerhalb der ersten if-Abfrage ein Array zu erzeugen, was ich dann im Loop einlese.
z.B. sowas hier:

Code: Select all

    
    .
    .
    .
  if vergleichX between -40 and 40 ; Falls die 2 Punkte auf der gleicher Y-Achse liegen (+-40 px Toleranz im X-Bereich):
  {
    achse = Y
    ;koordinaten := {x1: startX, y1: naechstesY}
    ;koordinaten := {x1: %startX%, y1: %naechstesY%}
    koordinatenArray := [startX, naechstesY]
    ;koordinatenArray := [L, startX, naechstesY, zielX, zielY] ; Mauszeiger auf nächsten Punkt befördern (in Y-Achse), Linksklick halten, auf Zielpunkt setzen und loslassen
  }
  .
  .
  .
  Loop, %schritte% ; So oft wiederholen wie die Anzahl ermittelter Schritte
  {
    koordinateX := koordinatenArray[1]
    koordinateY := koordinatenArray[2]
    ;MouseClickDrag, L, koordinaten.x1, koordinaten.y1, zielX, zielY
    MouseClickDrag, L, koordinateX, koordinateY, zielX, zielY
    Sleep, 50
    MsgBox, %koordinateX%, %koordinateY%
    naechstes%achse% := naechstes%achse% + unterschied%achse% ; Die Positionen der nächsten Punkts ermitteln (bis zum letzten Punkt)
    Sleep, d
    .
    .
    .
  }
  
Aber das war dann doch zu viel des Guten.
Übertreiben kann es bekanntlich ja immer.

Viele Grüße
Please use [code][/code] when posting code!
Keyboard: Logitech G PRO - Mouse: Logitech G502 LS - OS: Windows 10 Pro 64 Bit - AHK version: 1.1.33.09
User avatar
SL5
Posts: 879
Joined: 12 May 2015, 02:10
Contact:

Re: Mein Maus-Recorder funktioniert nur in X-Achse

08 Jan 2019, 17:43

Scr1pter wrote:
08 Jan 2019, 13:42
.. @SL5:
Danke für die netten Worte! ... Debuggen ist natürlich hohe Schule (für mich jedenfalls)...
Was ich jedenfalls immer tue, ist es, mir MessageBoxes anzeigen zu lassen....
- Werte von Variablen unter einander zu schreiben - im Prinzip wie eine LOG (was du ja erwähnt hast) ...
du kannst auch mit MessageBoxes ein quasi log machen.
diese ordnen sich immer von selbst an und wenn du eine schliesst schliesen sich alle folgenden mit:
https://github.com/sl5net/global-Intell ... .ahk#L1101
wobei das mit den lll log wirlich sehr nütlich ist. ich verwedne oft beides. die ganz wichtigen stöhrer per obiger box und ansonsten immer logs.
auch sehr gut sprachausgabe. hilft mir auch sehr.
aber debuggen ist eigentlich mit nem guten tool gar nicht schwrh. im gegenteil. es macht ja das leben leichter. darum geht es. z.b. ahkStudio kann das von hause aus. probiers doch mal :-) AHK-Studio

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 31 guests