Makro starten

  • Hast du vielleicht einen Tipp an was ich mich orientieren kann

    Inwiefern? In der Autoithilfe findest du unter Sprachreferenz ein simples Beispiel zum Erstellen einer Funktion mit Parameter und Rückgabewert. Was die eigentliche Aufgabe angeht kannst du dich ja am bisherigen Code orientieren.

    Deine Funktion muss grob folgendes tun:

    0. Rückgabe Variable $iActionNumber lokal in der Funktion deklarieren und den Wert 0 (kein Treffer, Maus außerhalb der Bereiche) zuweisen

    1. Mausposition ermitteln

    2. Für alle im Array definierten Bereiche prüfen ob die ermittelte Mausposition innerhalb des jeweiligen Bereichs ist, Sobald du einen Treffer hast setzt du deine Rückgabevariable auf die zugehörige "ActionNumber" der Array Zeile und verlässt die Schleife mit dem Statement exitloop, damit unnötige weitere Prüfungen vermieden werden. Für diesen Teil solltest du dir im Array Tutorial den Umgang mit Schleifen und Arrays nochmal anschauen.

    3. Nun gibst du dein Ergbnis mittels Return $iActionNumber zurück und verlässt die Funktion

    Zum Überprüfen deiner Funktion empfiehlt es sich die Ergebnisse des Funktionsaufruf mit consolewrite in der Sciteconsole auszugeben. So kannst du dann live sehen sobald deine Maus sich in Bereich 1 oder 2 bewegt. Funktioniert das zuverlässig kannst du weitermachen und die anderen Funktionen implementieren und testen.

    Einmal editiert, zuletzt von misterspeed (21. November 2017 um 21:52)

  • Es ist nicht ganz klar was du meinst, aber ich denke du willst die Auswertung der Positionen machen.

    Dazu brauchst du mal eine Schleife und dazu verwendest du am Besten gleich die Schleife die du sowieso brauchst,

    damit das Script sich nicht gleich wioeder schliesst.

    Darin solltest du die Mausposition abfragen aber diesmal bitte nur eine Abfrage, dann vergleichst du nach jeder Abfrage

    ob eine Position aus dem Array darauf zutrtifft und entscheidest dabei welche Aktion ausgeführt wird.

    Du könntest auch gleich den Inhalt des Send-Befehls als String im Array unterbringen.

    Beispiel

    AutoIt
    Global $aActionAreas[3][5] = 
    [["Actionsnummer/Makronummer","xStart","xEnd","yStart","yEnd"],["^a",957,
     1132, 305, 349],["^b",757, 832, 305, 349]]
    
    Send($aActionAreas[1][0]) oder Send($aActionAreas[2][0])

    Und nicht vergessen die While oder Do Schleife durch einen kleinen Sleep(80) etwas drosseln ich hatte bei deinem Ersten Script eine

    CPU(Kern)-Last von fast 100%

    Und nimm das Angebot von misterspeed lieber an, von ihm könntest du in 2 Monaten mehr Lernen als ich mir in

    2 Jahren selbst beigebracht habe.

  • Tuxedo hat natürlich recht, dass man das alles auch etwas kompakter und direkter programmieren kann. Ich hab das hier aber bewusst nicht vorgeschlagen, damit es verständlicher und Übersichtlicher bleibt und verschiedene Teilaufgaben klar voneinander getrennt bleiben. Das erleichtert es hier auf Detail- / Anfängerfragen besser einzugehen und man sieht immer wieder kleine Erfolgserlebnisse (z.B. dass der Bereich nun korrekt und live in der console angegeben wird), Davon ab ist das Vorgehen für komplexere und größere zukünftige Scripte hilfreich. Optimieren kann man ein funktionstüchtiges Script immer auch im Nachhinein.

    Zuviel auf einmal führt zu Fehlern und Frustation wenns eben nicht sofort alles funktioniert. Ich glaub wir wollen alle nicht, dass seine Hauptschleife endlos Excelinstanzen startet und seinen Rechner nach wenigen Sekunden zum Absturz bringt. :P

  • Ich denke ich werde mich in Zukunft auch an deine Fersen heften um von dir soviel wie möglich lernen zu können,

    das von dir beschriebene zwingt mich nämlich dazu nur kleine Scripte zu schreiben weil ich sonst den Überblick verliere,

    Ich hoffe ich kann auch auf dich zählen misterspeed.

  • Sorry aber ich muss Fragen weil ich nicht wirklich weiter weiss

    Zitat

    0. Rückgabe Variable $iActionNumber lokal in der Funktion deklarieren und den Wert 0 (kein Treffer, Maus außerhalb der Bereiche) zuweisen

    Local $iActionNumber = "0" hab das eingetragen sollte passen

    Zitat

    1. Mausposition ermitteln

    2. Für alle im Array definierten Bereiche prüfen ob die ermittelte Mausposition innerhalb des jeweiligen Bereichs ist, Sobald du einen Treffer hast setzt du deine Rückgabevariable auf die zugehörige "ActionNumber" der Array Zeile und verlässt die Schleife mit dem Statement exitloop

    aber jetzt wirds schwierig was auch sonst

    Local $aPos

    While 1

    $aPos = MouseGetPos()

    If $aPos = $aActionAreas[0][1] then

    MsgBox(0, "", "Koordinaten")

    EndIf

    ExitLoop

    WEnd

    Irgendwo ist hier ein Fehler es kommt keine Msg wenn ich die Maus zu den Koordinaten bringe

  • Code
    $aPos ist ein Array, keine Variable.

    Und das heisst was?

    In der Hilfe die Funktion mousegetpos() anschauen.

    Dort steht unter anderem:

    Zitat

    Returns a two-element array that containing the mouse coordinates: $array[0] = X coord (horizontal), $array[1] = Y coord (vertical)


    So die Funktion sagt dir also die Xmaus Koordinate und Ymaus Koordinate, welche jeweils in einem Element des mousegetpos Arrays gespeichert ist.

    Deine eigene Funktion soll nun prüfen ob die Maus innerhalb der Bereiche liegt.

    In deinem eigenen Array hast du die minimalen und maximalen X bzw. Y Koordinaten jedes Bereichs gespeichert.

    Deine Funktion muss nun also prüfen ob:

    - (Xmaus größer Xmin UND Xmaus kleiner Xmax) UND (Ymaus größer Ymin UND Ymaus kleiner Ymax) ist -> korrekt wäre im Übrigen statt "<" bzw ">" ein "<=" bzw. ">=" ein Pixel hin oder her spielt aber nicht wirklich eine Rolle

    - wenn ja liegt die Maus im Bereich, wenn nein liegt sie irgendwo anderst

    Diese Prüfung musst du für alle gespeicherten Bereiche in deinem eigenen Array machen. Sowas hab ich im Übrigen in deinem allerersten Script schon gesehen.

    Einmal editiert, zuletzt von misterspeed (23. November 2017 um 19:09)

  • Local $iActionNumber = "0" hab das eingetragen sollte passen

    Passt im Übrigen nicht ganz, auch wenn es zufällig keinen Unterschied macht.

    Alles was du in Anführungszeichen setzt interpretiert Autoit als String und nicht als Zahl, bzw intern wird ein String als die Zahl 0 interpretiert. Deswegen passt das hier zufälligerweise.

    Zahlen solltest du aber um Probleme bei logischen Vergleichen zu vermeiden immer ohne Anführungszeichen in Variablen/Arrays speichern. Ansonsten wunderst du dich irgendwann warum deine IF Bedingung immer ein falsches Ergebnis liefert statt dem von dir erwarteten.

    Einmal editiert, zuletzt von misterspeed (23. November 2017 um 19:11)

  • If $aPos = $aActionAreas[0][1] then

    Bedenke bitte, dass dein Array in Zeile 0 keine Bereichs Koordinaten enthält, sondern nur die Überschriften des Arrays (zumindestens wenn du dich Aufgrund meines Tipps dazu entschieden hast Überschriften zu speichern).

  • misterspeed

    Dank deiner Hilfe kann ich jetzt meine Koordinaten bestimmen --- Super !!!!

    Spoiler anzeigen

    Local $aPos

    While 1

    Sleep(80)

    $aPos = MouseGetPos()

    If $aPos[0] >= $aActionAreas[1][1] And $aPos[0] <= $aActionAreas[1][2] And $aPos[1] >= $aActionAreas[1][3] And $aPos[1] <= $aActionAreas[1][4] Then

    ConsoleWrite("Position 1" & $aActionAreas & @CRLF )

    Else

    If $aPos[0] >= $aActionAreas[2][1] And $aPos[0] <= $aActionAreas[2][2] And $aPos[1] >= $aActionAreas[2][3] And $aPos[1] <= $aActionAreas[2][4] Then

    ConsoleWrite("Position 2" & $aActionAreas & @CRLF )

    EndIf

    EndIf

    WEnd

    Aber es bleibt weiter ein K(r)ampf für mich denn du schreibst

    Zitat

    Sobald du einen Treffer hast setzt du deine Rückgabevariable auf die zugehörige "ActionNumber" der Array Zeile und verlässt die Schleife mit dem Statement exitloop, damit unnötige weitere Prüfungen vermieden werden.

    3. Nun gibst du dein Ergbnis mittels Return $iActionNumber zurück und verlässt die Funktion

    Sorry aber das verstehe ich nicht

  • Ich kürz das nun mal ein wenig ab... denke so ist es verständlicher wie der Aufbau gemeint war:

    Spoiler anzeigen

    3 Mal editiert, zuletzt von misterspeed (24. November 2017 um 22:00)

  • Erstmals Danke für dein Hilfe und vorallem Geduld ist nicht selbstverständlich ohne deine "Kritik" hätte ich wahrscheindlich aufgegeben.

    Ich habs jetzt so gelöst

    Spoiler anzeigen

    While 1

    Sleep(80)

    $aPos = MouseGetPos()

    If $aPos[0] >= $aActionAreas[1][1] And $aPos[0] <= $aActionAreas[1][2] And $aPos[1] >= $aActionAreas[1][3] And $aPos[1] <= $aActionAreas[1][4] Then

    $iActionNumber = 1 ;MsgBox(0, "", "Position 1") ;ConsoleWrite("Position 1" & $aActionAreas & $aPos & @CRLF ) ;

    ExitLoop

    Else

    If $aPos[0] >= $aActionAreas[2][1] And $aPos[0] <= $aActionAreas[2][2] And $aPos[1] >= $aActionAreas[2][3] And $aPos[1] <= $aActionAreas[2][4] Then

    $iActionNumber = 2;ConsoleWrite("Position 2" & $aActionAreas & @CRLF ) ;MsgBox(0, "", "Position 2")

    ExitLoop

    EndIf

    EndIf

    WEnd

    If $iActionNumber = 1 Then

    MsgBox(0, "", "Makro1 starten")

    EndIf

    If $iActionNumber = 2 Then

    MsgBox(0, "", "Makro2")

    EndIf

    Ist für dich wahrscheindlich zum Lachen aber es läuft, kann es im Moment nicht besser / effizienter / einfacher

    Dein Script ist für mich Gold Wert da ich einen richtigen Aufbau sehe und daraus Lernen kann werde ihn für meine Zwecke nutzen.

    Nochmal vielen Dank an dich und die anderen Jungs auch wenn die Antworten manchmal zumindest für mich schwer zu Verstehen sind.

    :)

  • Der Code mag im Moment nicht perfekt sein, aber er funktioniert und du verstehst hoffentlich

    warum und wie er funktioniert, das wäre die Hauptsache.

    Jetzt könntest du dir 2 neue Ziele vorgeben:

    1. Daß das Script nicht nach jeder Aktionsauslösung neu gestartet werden muss, denn so wie du es jetzt hast

    beendet es sich nach einer Erkennung einer deiner beiden Positionen.

    2. Dein Script erkennt im Moment nur deine 2 Positionen, jetzt könntest du dir vornehmen, es so

    umzubauen, daß auch noch weitere Positionen erkannt werden könnten, so quasi als Fleißaufgabe.

    Aber sorge am Besten immer mit einer Sicherheitskopie deines Scripts vor, damit du dein schon

    funktionierendes Script nicht verlierst.

    So kannst du eine Menge lernen, probier's aus.

    Viel Glück

    Tuxedo