![]() |
Anwendungen steuern - Delphi unfähiger als andere Sprachen?
Hi Leute!
Ich habe vor einem Jahr ca. einen Login Bot für ein japanisches Grind-MMORPG geschrieben. Damals schon stiess ich auf die "Grenzen" von Delphi eine andere (3D) Anwendung zu steuern. Während meiner heutige DP Suchvorgänge bin ich auf einige Threads gestossen welche das gleiche Thema beherrbergten und es nie zur Lösung kam: wieso reagiert die die andere Anwendung nicht auf sämtliche Tricks des Delphi-Postmessage, Sendkeys oder mouse_events? Ich wollte für ein paar Freunde einen Angel Bot für eines dieser japanischen online rollenspiele schreiben. Es müssen nur 2 "Buttons" gedrückt werden. Alternativ kann ich auch die Taste 1 und/oder 2 nutzen. So eine sehr banale Sache erledigt auch so manche Hardware: das Nostromo Speedpad oder die G15 Tastatur von Logitech. Ich sagte den Jungs aber: kein Problem, wenn euch das so wichtig ist braucht könnt ihr euch die 30€ bzw die 70€ sparen, ich schreib schnell ein paar Zeilen und gut ist. Weit gefehlt! Alles klappt wunderbar: Mauspositionen finden, das Fensterhandle der Anwendung finden, Mausposition an die richtige Stelle verschieben.... aber die wichtigste Aktion: das Drücken des Buttons geht mit keinem einzigen Trick. Ich hab sämtliche vorgeschlagene Methoden der Suchergebnisse angewand:
Delphi-Quellcode:
Es ist absolut nix zu machen.... Komischerweise gibts aber nen Haufen sogenannter Bots welche alle möglichen eingaben im Spiel machen, sogar die Spielfigur bewegen und und und...
mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0); PostMessage(clientHandle, wm_KeyDown, $31,0); SendKeys('1',FALSE); PostKeyEx32(Ord('1'), [], False); SendMessage(clientHandle, WM_LBUTTONDOWN, MK_LBUTTON, MakeLParam(50, 50)); SendMessage(clientHandle, WM_LBUTTONUP, 0, MakeLParam(50, 50)); Wer weiss mit welcher Sprache die geschrieben wurden, aber Delphi schafft es bis heute net einen simplen Knopfdruck zu machen. Meines wissens hat das spiel net mal einen anti_cheat mechanismus. Geht das so tief in die Hardware dass da nur C++ ne Chance hat? |
Re: Anwendungen steuern - Delphi unfähiger als andere Sprach
Delphi hat überhaupt keine Möglichkeiten zur Manipulation anderer Programme. Die von dir genannten sind allesamt Windows-API-Funktionen und die sind für alle Sprachen gleich. Mit C++ kannst du zwar "hardwarenäher" programmieren (Treiber etc.), aber im Endeffekt nützt dir das nichts für die Fernsteuerung von Programmen, weil Windows die Programme voreinander schützt und dementsprechend auch nur der Umweg über Windows zielführend ist. Das Programm reagiert vermutlich deshalb nicht darauf, weil es entweder doch einen Anti-Cheat-Mechanismus hat, oder weil es einfach einen anderen Mechanismus für die Eingabe verwendet als den, auf den du im Endeffekt zugreifst. Davon abgesehen halte ich es nachwievor für fragwürdig, für ein Onlinespiel Cheats/Bots zu benutzen. Beim G15 _könnte_ es sogar sein, dass die Tastatur die Makrofolge tatsächlich als Tastendrücke an den Rechner sendet.
|
Re: Anwendungen steuern - Delphi unfähiger als andere Sprach
Nachtrag: ich muss fairerweise dazusagen, dass einige Keys trotzdem gehen. Also z.B. ein VK_Return wird ausgeführt (die Return Taste bewirkt das Aufklappen eines Chatfensters) Wenn ich nach dem aufpoppen des CHatfensters dann die Taste 1 Sende, steht auch im Chat eine 1...
Das heisst die Informationen kommen an, aber nicht so wie man es sich wünscht. Bei geschlossenem CHatfenster bewirkt das Senden der 1 nix, obwohl die 1 ein Hotkey für die "Angel" ist. Wenn das Chatfenster offen ist kommt die 1 an.... :wiejetzt: Ich versteht das überhauptnicht. Sicher ist es fragwürdig Bots, Cheats usw zu schreiben, aber mich interessiert es nun technisch wieso das andere SPrachen schaffen und Delphi nicht. |
Re: Anwendungen steuern - Delphi unfähiger als andere Sprach
Ich kann dir zwar nicht endgültig zur Lösung beitragen, aber ich wiederhole nochmal: Das hat nichts mit der Sprache/Umgebung Delphi zu tun. Wenn dein Programm es nicht schafft, liegt es an den von dir verwendeten Funktionen und nicht an Delphi.
|
Re: Anwendungen steuern - Delphi unfähiger als andere Sprach
Vielleicht wertet das Programm die Buttonclicks aus und denkt sich: Wer es schafft innerhalb von 0.000 ms einen Button anzuklicken, ist kein richtiger Mensch.... Bau doch mal ein Sleep zwischen DOWN und UP rein.....
|
DP-Maintenance
Dieses Thema wurde von "SirThornberry" von "Sonstige Fragen zu Delphi" nach "Windows API / MS.NET Framework API" verschoben.
|
Re: Anwendungen steuern - Delphi unfähiger als andere Sprach
anhand des geposteten Quelltextes würde ich vermuten das du die Hilfe zu den Funktionen nicht gelesen hast?!
Bei Verwendung von:
Delphi-Quellcode:
erwarte ich das so gut wie nichts passiert was du gern hättest. Der Grund wird dir klar wenn du die Hilfe zu der Funktion anschaust (
mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0); ![]() |
Re: Anwendungen steuern - Delphi unfähiger als andere Sprach
Hi,
hast du es schon mal mit der procedure "PostKeyEx32" probiert? Diese hat soweit ich weiß den Vorteil, das sie wirklich ein Tastendruck auslöst, während sendmessage diesen "simuliert". Procedure:
Delphi-Quellcode:
Aufruf:
procedure PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean);
type TShiftKeyInfo = record shift: Byte; vkey: Byte; end; byteset = set of 0..7; const shiftkeys: array [1..3] of TShiftKeyInfo = ((shift: Ord(ssCtrl); vkey: VK_CONTROL),(shift: Ord(ssShift); vkey: VK_SHIFT),(shift: Ord(ssAlt); vkey: VK_MENU)); var flag: DWORD; bShift: ByteSet absolute shift; i:Integer; begin for i := 1 to 3 do begin if shiftkeys[i].shift in bShift then keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), 0, 0); end; if specialkey then flag := KEYEVENTF_EXTENDEDKEY else flag := 0; keybd_event(key, MapvirtualKey(key, 0), flag, 0); flag := flag or KEYEVENTF_KEYUP; keybd_event(key, MapvirtualKey(key, 0), flag, 0); for i := 3 downto 1 do begin if shiftkeys[i].shift in bShift then keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0),KEYEVENTF_KEYUP, 0); end; end;
Delphi-Quellcode:
Vielleicht hilft dir das ja, auch wenn es nicht um dein angesprochenes Thema geht.
PostKeyEx32(VK_TAB, [ssshift], False);
application.ProcessMessages; sleep(100); greez gabneo [Edit] Der Code funktioniert bei mir mit dem Fernsteuern vieler Anwendungen. Deswegen bin ich von Sendmessage() weggegangen. [/Edit] PS:Ich weiß nicht mehr woher ich den Code habe...sry |
Re: Anwendungen steuern - Delphi unfähiger als andere Sprach
Der Code ist von toms und findet man hier im Forum ;-)
|
Re: Anwendungen steuern - Delphi unfähiger als andere Sprach
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz