Mein Maus-Recorder funktioniert nur in X-Achse
Posted: 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):
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:
Trotz mehrmaligen Lesens komme ich nicht auf den Fehler.
Danke für jede Hilfe.
Grüße
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
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:
Trotz mehrmaligen Lesens komme ich nicht auf den Fehler.
Danke für jede Hilfe.
Grüße