Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Anwendungen steuern - Delphi unfähiger als andere Sprachen? (https://www.delphipraxis.net/100196-anwendungen-steuern-delphi-unfaehiger-als-andere-sprachen.html)

Ajin 24. Sep 2007 13:03


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:
 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));
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...
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?

OregonGhost 24. Sep 2007 13:11

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.

Ajin 24. Sep 2007 13:12

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.

OregonGhost 24. Sep 2007 13:14

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.

alzaimar 24. Sep 2007 14:12

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 24. Sep 2007 15:11

DP-Maintenance
 
Dieses Thema wurde von "SirThornberry" von "Sonstige Fragen zu Delphi" nach "Windows API / MS.NET Framework API" verschoben.

SirThornberry 24. Sep 2007 15:14

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:
mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
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 ( http://msdn.microsoft.com/library )

gabneo 24. Sep 2007 15:15

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:
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;
Aufruf:
Delphi-Quellcode:
PostKeyEx32(VK_TAB, [ssshift], False);
application.ProcessMessages;
sleep(100);
Vielleicht hilft dir das ja, auch wenn es nicht um dein angesprochenes Thema geht.
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

Die Muhkuh 24. Sep 2007 15:17

Re: Anwendungen steuern - Delphi unfähiger als andere Sprach
 
Der Code ist von toms und findet man hier im Forum ;-)

inherited 24. Sep 2007 15:22

Re: Anwendungen steuern - Delphi unfähiger als andere Sprach
 
Zitat:

Zitat von Ajin
Anwendungen steuern - Delphi unfähiger als andere Sprachen?

Definiere "Andere Sprachen"!

SirThornberry 24. Sep 2007 15:24

Re: Anwendungen steuern - Delphi unfähiger als andere Sprach
 
Wenn man den Unterschied zwischen Sendmessage und keybd_event kennt, weiß man auch wann man was zu nutzen hat und was welche Nachteile hat. Der Urheber von PostKeyEx32 wusste zum Beispiel einfach wie keybd_event aufzurufen ist (steht ja auch in der Hilfe) und konnte dadurch seine Funktion drum herum bauen.

Ich denke einige sollte einfach nur zu der Erkenntnis kommen das Hilfe lesen meist mehr bringt also einfach nur fertige Funktionen anderer zu kopieren ohne zu verstehen was diese machen!

Ajin 24. Sep 2007 15:54

Re: Anwendungen steuern - Delphi unfähiger als andere Sprach
 
Ich habe schon einiges in Hilfen gelesen, MSDN Library und jede Menge Beiträge von ähnlichen Themen. Leider wirds ab einer gewissen Stelle sehr kompliziert und ich steig da nicht mehr ganz durch. Deshalb probiere ich jede erdenkliche Möglichkeit aus.

"Andere Sprachen" Definieren kann ich nicht, ich kann nur vermuten dass es sich um C++ handelt da ich keinen Quelltext von diesen schönen Tools habe.

Das gleiche Thema

EWeiss 24. Sep 2007 16:04

Re: Anwendungen steuern - Delphi unfähiger als andere Sprach
 
Bedenke das einige Anwendungen nur auf einen Tastendruck reagieren wenn sie aktiv sind.
Also könnte unterumständen ein APPACTIVATE von nöten sein um den Button tatsächlich drücken zu können.

bzw.. die Anwendung erst aktivieren bevor du das Kommando verschickst.

EDIT:
Sendmessage braucht einfach zu lange und ist nicht schnell genug zum senden von Keys.

gruss Emil

Ajin 24. Sep 2007 16:12

Re: Anwendungen steuern - Delphi unfähiger als andere Sprach
 
Daran hab ich gedacht! :drunken:

SirThornberry 24. Sep 2007 16:16

Re: Anwendungen steuern - Delphi unfähiger als andere Sprach
 
Zitat:

Sendmessage braucht einfach zu lange und ist nicht schnell genug zum senden von Keys.
:shock: Kannst du das genauer erklären? Ich hätte gedacht das keybd_event langsamer ist.
Dachte keybd_event plaziert den Key weiter unten (low-level gesehen). Und von dort aus wird es dann in die MessageQueue gelegt wovon es durch die Nachrichtenschleife abgeholt wird.
SendMessage hingegen sollte nichts in der Messagequeue ablegen sondern ruft direkt die Wnd-Proc auf.
So war zumindest bisher meine Annahme/Wissensstand.

EWeiss 24. Sep 2007 16:29

Re: Anwendungen steuern - Delphi unfähiger als andere Sprach
 
Zitat:

Zitat von SirThornberry
Zitat:

Sendmessage braucht einfach zu lange und ist nicht schnell genug zum senden von Keys.
:shock: Kannst du das genauer erklären? Ich hätte gedacht das keybd_event langsamer ist.
Dachte keybd_event plaziert den Key weiter unten (low-level gesehen). Und von dort aus wird es dann in die MessageQueue gelegt wovon es durch die Nachrichtenschleife abgeholt wird.
SendMessage hingegen sollte nichts in der Messagequeue ablegen sondern ruft direkt die Wnd-Proc auf.
So war zumindest bisher meine Annahme/Wissensstand.

Ja ruft sie auf ;) Kommt aber zu spät oder zu langsam an.
In Bassvis habe ich zu anfangs auch Sendmessage ala Winamp verwendet.
Mußte aber feststellen das ohne vorrangesetzten Sleep es nicht möglich war die Daten in der Winproc zu verarbeiten.
Besonders kritisch wird das wenn die Anwendung auch noch OpenGl Plugins zur zeit verwendet.

Habe es deshalb geändert da ich den Anwender nicht zumuten konnte 100.te von Sleeps in seinen Code zu verwenden.

EDIT:
Kann es sein das er vielleicht die Keys nicht deklariert hat ?
Delphi-Quellcode:
keys : Array[0..255] of Boolean;
SendMessage:
Diese Funktion sendet eine Nachricht an ein Entsprechendes Fenster bzw. seiner Fensterprozedure und gibt dessen Rückgabe zurück.

PostMessage:
Diese Funktion sendet eine Nachricht an ein angegebenes Fenster welche nicht an das Fenster direkt sondern an dessen Nachrichteneingangspuffer übermittelt wird wobei nicht auf eine bestätigung des Threads gewartet wird.

gruss Emil

gabneo 24. Sep 2007 16:33

Re: Anwendungen steuern - Delphi unfähiger als andere Sprach
 
Das dachte ich eigentlich auch??? :?:

@Sir Thornberry
Ich verstehe durchaus den Code den ich gepostet habe. Doch hänge ich gerade an der selben Wissenslücke an der du auch hängst, sollte schon erlaubt sein :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:34 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