"Ablauf Script" Frage(n) zur (idealen) Umsetztung
Übersicht

mactepBetreff: "Ablauf Script" Frage(n) zur (idealen) Umsetztung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
für ein Projekt benötige ich etwas Hilfe.Wenn ich jetzt z.b. eine Datei mit folgendem inhalt habe Code: VK_DOWN VK_UP VK_LEFT VK_RIGHT WAIT_1000 VK_H VK_A VK_L VK_L VK_O Ziel : -Jede Zeile einzeln abzurufen und den jeweiligen Befehl zu Starten Also bei Code: VK_LEFT soll der Befehl kommen um einen Tastendruck zu Simulieren.
Bei Code: WAIT_1000 soll das Programm 1000ms warten bis es weiter macht...usw. bis zum Datei ende.
Ist etwas Blöd zu erklären,hoffe ihr versteht was ich meine und könnt mir einige Tipps zur Umsetzung geben. Vielen Dank für eure Zeit` Lg Michael |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Was für Tipps erwartest du denn? Wo siehst du die Schwierigkeiten oder Probleme?
Dateien lesen, Aktionen in einer Datenstruktur speichern, Aktion ausführen - klingt jetzt nicht besonders herausfordernd, wenn du nichts zu den Rahmenbedingungen schreibst. Soll das nur ein Programm steuern oder tatsächlich per win API richtige Tastendrücke simulieren? |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
mactep |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
danke für deine Antwort. Ja, ich möchte per WinAPI Tastendrick Simulieren.Habe das ganze schon getestet. Benötige halt hilfe bei der Ausführung und umsetzung des Scriptes.Weis nicht genau wie ich vorgehen soll. Brauche und will da jetzt keinen "Ganzen" Code dafür aber für "Schnipsel" zur Umsetzung währe ich Dankbar. So lerne ich halt am schnellsten wenn du /jemand dass nachvollziehen kann ![]() |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also einfach mal ins blaue ein paar tipps:
Step1: Du brauchst ein paar variablen bzw ein array, wo du "anweisungen" reinspeicherst. Jede anweisung kann ein int sein (fortlaufende zahl) zb ist VK_A = 1,VK_B = 2 undsoweiter undso fort. Diese werte musst du dir im programm zb über CONST merken. Dann brauchst du was zum auslesen. Beispiel: Lese jede zeile der datei aus und checke den ersten part (bis _ ). Nach den schlagworten dort filterst du und leitest an processing-funktionen weiter. Die "Vk"-checkfunktion prüft nun den nachfolgenden part ( A oder B als beispiel) und gibt die entsprechende CONST zurück ( also, wenn VK_A = 1, dann gibts die 1 wieder bzw die const dafür) Die werte die du von jeder zeile erhälst kommen per return zurück und werden in den array geleitet. Ist die datei entsprechend verarbeitet, gehst du in den mainloop. Der mainloop prüft immer den nächsten wert im array und leitet ihn an verarbeitungsfunktionen weiter. Um das wiederum übersichtlich zu halten, werden key-bereiche (also der VK krams) an eigene funktioenn weitergeleitet. Wiederrum alles prüfen und die entsprechende funktion ausführen die die taste sendet. Kleiner tipp am rande: Das was du machen willst lässt sich super mit Autoit3 umsetzen (script krams) Der code für deinen test da sähe wie folgt aus: Code: Send("{Down}{up}{left}{right}")
Wait(1000) Send("hallo") Links musst du dir selber suchen, da basic fremd. Grundsätzlich also: Was du machen möchtest ist möglich, läuft aber sehr wahrscheinlich auf Winapi funktionen, mega große abfragebäume und zeitaufwand hinaus. Aber es gibt auch alternativen, kommt halt drauf an - willst du den pc steuern? Alternative suchen. Brauchst du speziell was in basic, zb für ein minispiel in einem spiel? Fragestellung präzisieren. Willst du deinen pc scriptsteuern und willst es umbedingt in Blitzbasic? Dann mach dich auf arbeit gefasst ^^ Nachtrag: Noch ein bissl beispiel. Ist wahrscheinlich keine korrekte blitzbasic syntax (ich schreibs wie in blitzmax), aber als "pseudocode" dürfts reichen. Code: ;Const daten Const VK_A:int = 1 Const VK_H:int = 8 Const VK_L:int = 12 Const VK_o:int = 15 Const WAIT:int = 500 ; sprung auf 500 damit der bereich von 0-499 für VK reserviert bleibt. ;------------------- Local workdata:int[] = new int[1000] ;1000 anweisungen platz Local dataCount:int = 0 Local file:String = "script.txt" Local data:String[] = ReadLines(file) ; die entsprechende datei zeilenweise als array For local i:int = 0 to Len(data)-1 Local predata:String = GetFirstPart(Data[i]) ; GetFirstPart schneidet den bereich VOR dem _ ab und gibt es zurück. Funktion ebenfalls selbst schreiben! if predata = "VK" then workdata[dataCount] = GetVKCode(GetLastPart(Data[i])) ; GetLastPart schneidet den bereich NACH dem _ ab und gibt es zurück. Funktion ebenfalls selbst schreiben! dataCount = dataCount + 1 elseif predata = "WAIT" then workdata[dataCount] = WAIT workdata[dataCount+1] = GetWaitTime(GetLastPart(Data[i])) dataCount = dataCount+2 endif next ; Hauptschleife Local processed:int = 0 While processed < dataCount If workdata[processed] < 500 ; VK bereich ProcessKey(workdata[processed]) processed = processed + 1 elseif workdata[processed]= WAIT ; sleep befehl Sleep(workData[processed+1]) processed = processed +2 else Print("Unable to process code: "+workdata[processed]) processed = processed + 1 endif wend ; Beispiel: Key-code string zu int umwandeln. Möglichkeit 1: Simples if abfragen ; eine andere idee wäre hier, den string als asciicode zurück zu geben und entsprechenden die CONST's anzupassen. Der befehl hierfür ist meines wissens Asc("A") Function GetVKCode:int(data:String) if data = "A" then return VK_A if data = "H" then return VK_H if data = "L" then return VK_L if data = "O" then return VK_O return -1 end function Function ProcessKey(vkCode:int) If vkCode = VK_A then ; a senden elseif vkCode = VK_H then ; h senden elseif vkCode = VK_L then ; l senden elseif vkCode = VK_O then ; o senden endif End Function Ps: Falls in BlitzBasic Select / Case bäume existieren, bieten die sich natürlich an. Pss: Du kannst shift zb emulieren, indem du bei der "shift" anweisung eine variable auf 1 setzt und den entsprechenden großbuchstaben in dem fall sendest. |
||
mactep |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi,
das Hilft weiter vielen Herzlichen Dank! Der Hintegedanke: Für ein MMORPG (Elder Scrolls Online) möchte ich eine "Emote Station" Bauen: Arduino mit Keypad oder IR Ferbedinung <--> Sendet per Knopfdruck an mein Prog per Comport einen Befehl. Diesen Befehl Verarbeite ich dann weiter und führe die gewünschte Aktion aus.Sachen wie /Hi /sleep /dance /drum /flute etc. (evtl ein AFK Script ![]() Hab das ganze schon Ingame Getestet (ohne BANN!) funktioniert Wunderbar. Zur leichteren Bedienung möchte ich halt die befehle in eine Datei schreiben um dann von meinem Prog. verwendet zu werden. Vielen Dank für deine Hilfe ! |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Solange du keinen echten Programmfluss einbauen willst (Schleifen, ifs und Ähnliches), sollte das ganz einfach sein, so wie PhilipK geschrieben hat.
Du kannst es dir noch einfacher machen, indem du das Programm einfach zeilenweise ausliest und für jede Zeile vergleichst, was für ein Befehl das ist: BlitzBasic: stream = ReadFile("input.txt") Das eigentliche Tastendruck-Simulieren machst du hiermit |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wenn du überwiegend auf "slash emotes" aus bist, halte ich es für sinnvoller wenn du eine verarbeitung für deine "befehle" schreibst, dh die strings selbst ausliest und keine anweisungsscripts baust.
Diese "anweisungsscripts" sind dann sinnvoll, wenn du wirklich etwas automatisieren willst. Die "auslagerung" in dateien kann zu verschiedenen problemen führen - nicht zuletzt wird deine festplatte bei falscher umsetzung leiden ![]() Wäre es dahingehend nicht sinnvoller, eine tastenbelegung oder ähnliches in eine datei auszulagern und intern befehle damit zu koppeln? Zb kann die datei wie folgt aussehen: "KEY_Eins = Hi" "hi" ist in dem fall ein schlagwort, was eine fest einprogrammierte key reihenfolge hat: Code: Function Hi()
Send("enter") Send("/") Send("H") Send("i") Send("enter") end function oder ähnliches. Wobei Send die funktion übernimmt die entsprechende taste per win api zu senden und spezialfälle wie Shift, Strg und Enter gesondert abfragt. Warum? Wenn du deine befehle als anweisungs-folge auslagern willst, sehe ich das problem kommen, das du die datei beim tastendruck öffnest^^ Bots oder was auch immer du planst können ebenfalls fest einprogrammiert werden. Alternativ: Eine gui, per Graphics() oder ähnlichem, in der du deine sachen belegen kannst. Ich denke einfach, das es schneller sein wird und fehleranfälligkeit runtersetzt wenn du deine Befehle fest einprogrammierst und nur irgendwie zuweist. Nicht zuletzt weil das "erstellen" deiner anweisungs-folgen auch einfach nervig sein wird. Wie DAK bereits sagte, diehnt mein ansatz btw nicht für komplexere programmstrukturen. Aber ich glaube das dies auf deine problemstellung eh nicht zutrifft. |
||
mactep |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vielen Dank für die Zahlreiche Unterstützung !
Fange morgen an, mal gucken was rauskommt. Bin jedoch zuversichtlich dass ich es jetzt geschnallt hab wie ich vorgehen muss. An alle ein Herzliches Dankö !! |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Noch eine kurze Anmerkung zu PhillipKs letztem Post:
Du kannst es schon auch auf die Festplatte auslagern, solange du es beim Programmstart ein mal einliest und zwischenspeicherst, so dass du nicht bei jedem Mal neu auf die Festplatte zugreifst. Es spricht jedoch nichts dagegen (wenn es dir hauptsächlich um Strings geht, die per Tastatur gesendet werden sollen), in deinem Code Strings direkt einzubauen. Also dass du statt Code: VK_ENTER
VK_SLASH VK_H VK_I VK_ENTER Code: VK_ENTER
"/hi" VK_ENTER machst und alles in Anführungszeichen einfach zeichenweise parst und die passende Taste drückst. Das auf-die-Platte-Auslagern macht aber nur wirklich Sinn, wenn öfteres Neukompilieren nicht in Frage kommt (weil du z.B. die Strings sehr oft änderst, von einem anderen Programm ändern lässt, oder du das Programm an jemanden weiter gibst, der kein BB hat und das Programm somit nicht neu kompilieren kann). Ansonsten wird es einfacher sein, die Befehle fix einzubauen. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group