an ein Flyff Fenster sendet. Ich denke da das mehrere Leute interessieren könnte, poste ich hier meine ausführliche Antwort auf die Frage.
Ob die Assembler Erklärung korrekt ist weiß ich nicht, sollte soweit auch
unwichtig sein.
Ich werde keine weiteren Fragen dazu beantworten.
Die benötigte .dll findet ihr hier:

einfach den Source Code oder kompilierte Version downloaden und
die Functions.dll Datei in das gewünschte Verzeichnis kopieren.
Ihr benötigt für die Ausführung folgendes:
Microsoft Visual C++ 2005 Redistributable Package (x86)
ControlClick und ControlSend steuert nur Controls an, das heißt grafische Benutzerobjekte wie zum Beispiel Buttons, Textfelder ect.. MouseClick würde nurQuote:
Originally Posted by ...Hiho,
ich hab grad dein Topic übers F-Tool-Extended gelesen.
Da ich soweit noch bissl Brain hab wollt mir selber was schreiben und drum hab ich etwas hier rumgesucht. Immo hab ich das Prob daß ich nicht genau weiß wie die Mouse und Keybefehle zu Fly durchkommen. Ich bekomme kein ControlSend, ControlClick oder MouseClick und dergleichen zustande. Das führte mich zu deinem Source und ich wolllt mir den mal ansehen. Da haste irgendwie noch was ausm anderem Spiel drin. Sieht irgendwie nach nem Bot für GW aus der mit Heros Zwergenpunkte farmt.
Würde mich freun wenn Zeit für ne Antwort oder Hilfe für mich hättest.
Immerhin hab ich gesehen das dir andere Sachen grad wichtiger sind.
Mfg
funktionieren wenn du eine asm Funktion integrierst die die Bits die gejumpt werden
bereits zuvor an die richtige Position stellst. Die DLL die ich benutze ist für die
Funktionen SendMessageA / PostMessageA / SetCurserPos ausgelegt. Send- und
PostMessage erbringen im Endeffekt das selbe Resultat, ich habe PostMessage benutzt.
die Message Befehle werden verglichen zu Control... an das Fenster gesendet, was
den Vorteil hat das Dieses nicht aktiv sein muss und auch versteckt sein kann.
Die Funktionen aus der DLL musst du wie folgt benutzen:
DllCall("Functions.dll", "none", "fnPostMessage", "HWnd", $feed_hwnd, "long", 256, "long", 48 + $feed_skill, "long",1)
Functions.dll ist die Bibliothek die aufgerufen wird, halt die dll.
der zweite Parameter wo "none" steht ist für den Wiedergabe Wert gedacht, den
wir aber nicht brauchen.
"fnPostMessage" steht für den Namen der Funktion die in der Bibliothek hinterlegt ist,
du brauchst fnPostMessage und fnSetCurserPos.
Alle jetzt folgenden Parameter sind die Parameter für die Funktion die du aufrufen
willst, also z.B. fnPostMessage. Du musst immer erst den Variablen Typ angeben und
danach die Variable bzw. den Wert selbst.
Als erstes habe ich "HWnd" und $feed_hwnd zu stehen.
HWnd steht dafür das der folgende wert ein Fenster Handle ist, also quasi die
einmalige Identifikation eines Fensters. Diese kannst du mit
WinGetHandle("title" [,"text" ]) ermitteln.
Nun zu "long" und 256.
PostMessage kann nicht nur normale Tastendrücke senden, sonder alle möglichen
Windows Messages, die kannst du dir in der AutoIt Hilfe Datei unter Appendix anschauen
um eine Taste an das Fenster zu senden benötigst du die Message 0x0100, das ist
WM_KEYDOWN. 0x0100 ist in hexadezimaler Schreibweise, welches in der dezimalen
Schreibweise 256 ergibt. Warum ich das umgerechnet habe weiß ich gerade auch nicht
mehr, die Hauptsache ist das du für die dezimale Schreibweise long benutzt und für
Hexadezimal int. Also so sieht das verglichen aus:
...."long", 256,....
...."int", 0x0100,....
Das vorletzte Pärchen der Parameter steht für den Tastendruck wenn du WM_KEYDOWN
benutzt (worüber ich gerade geschrieben habe).
hier benutzt du wieder long als Variablen Typ und
bekommstdu die jeweiligen Tasten Codes her.
Abschließend musst du noch einmal "long",0 schreiben
wobei eine Erklärung jetzt überflüssig wäre, du kannst
es dir aber in der MSDN Sammlung anschauen falls
es dich interessiert.
Ich glaube ich habe jetzt erklärt wie man eine Taste
sendet deswegen schreibe ich dir mal ein
Pseudo Script:
$Fenster = WinGetHandle("FLYFF")
DllCall("Functions.dll", "none", "fnPostMessage", "HWnd", $Fenster, "long", 256, "long", 65, "long",1)
Das würde die Taste "a" an das Fenster schicken.
Somit wäre das Senden einer Taste schonmal geschafft.
Jetzt zeig ich dir noch in Kurzform wie man die
Maus benutzt und dann solltest du alles können
um dein Script zu basteln.
Es ist wichtig das der Mauszeiger an exakt der
Stelle ist wo hingeklickt werden soll, deswegen
brauchst du die .dll Funktion fnSetCurserPos
Hier brauchst du kein Fenster anzusteuern, sondern
gibst lediglich die X und Y Koordinaten für den
Mauszeiger an, welche den Typ int entsprechen
müssen.
Beispiel:
DllCall("Functions.dll","int","fnSetCursorPos","in t", 300, "int", 200)
(da kommt kein Leerzeichen beim 2. int hin, das ist irgendein Anzeigefehler)
Die 300 steht für die X Koordinate und 200 für Y.
Nun musst du nur noch die Maus dazu bringen zu klicken, dafür benutzt
du wieder fnPostMessage. Jetzt jedoch brauchst du
die Windows Message WM_LBUTTONDOWN, also
0x0201. Dann hast du mit dieser Message noch
die Möglichkeit andere Tasten zu drücken, was aber
unwichtig ist. Der Code für den Linksklick ist 0x0001.
Jetzt wird es etwas knifflig. Die Koordinaten für den
Mausklick gibst du nicht so wie oben an, sondern
als LPARAM. Das ist ein Parameter aus z.B. C++ den
es in AutoIt als solchen garnicht gibt.
Dafür musst du folgende Funktion benutzen:
Func _MakeLong($LoWord,$HiWord)
Return BitOR($HiWord * 0x10000, BitAND($LoWord, 0xFFFF))
EndFunc
$LoWord ist X, $HiWord ist Y.
Den Wert fügst du dann als letzten Parameter
mit den Typ long ein.
Nun musst du noch eine WM_LBUTTONUP Message
aufrufen um den Cursor los zulassen.
Copy & Paste deine .dll Funktion und füge statt
0x0201 0x0202 ein.
Pseudo Script:
Func _MakeLong($LoWord,$HiWord)
Return BitOR($HiWord * 0x10000, BitAND($LoWord, 0xFFFF))
EndFunc
$Fenster = WinGetHandle("FLYFF")
$X = 300
$Y = 200
$LPARAM = _MakeLong(300,200)
DllCall("Functions.dll","int","fnSetCursorPos","in t", 300, "int", 200)
DllCall("Functions.dll","int","fnPostMessage","hwn d",$Fenster,"int",0x0201,"int",0x0001, "long",$LPARAM)
DllCall("Functions.dll","int","fnPostMessage","hwn d",$Fenster,"int",0x0202,"int",0x0001, "long",$LPARAM)
Das war es an sich schon, nur noch ein paar Hinweise:
Die Koordinaten sind immer bezogen auf deine Auflösung, das heißt das du erst die Koordinaten
deines Fensters herausfinden musst (WinGetPos) und
dann die Koordinaten wo du im Endeffekt im Fenster
hinklicken möchtest hinzu addieren.
Um zu verhindern das die Maus während des automatischen
klickens bewegt wird ist BlockInput(flag) hilfreich.
Ich glaube das war alles
MfG Mankana






