Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Text in Diablo II ausgeben (https://www.delphipraxis.net/28884-text-diablo-ii-ausgeben.html)

SuPp3nHuHn 1. Sep 2004 20:27

Re: Text in Diablo II ausgeben
 
Naja weiß net inwiefern ihr Diablo kennt / spielt...

Einige kennen aber sicher das Program d2jsp (diablo 2 java script parser) - mit diesem kann man wie der name schon verrät javascript code ausführen welchen das program dann in diablo 2 umsetzt.

Mit diesem wird in diablo was geschrieben, ohne problem, ohne flimmern.... einfach so...

Also gehts irgendwie... (ich will NICHT d2jsp nachbauen!)

Kann ich mithilfe von d2jsp evtl. herauskriegen wie's geht (also programm "zerlegen")

dizzy 1. Sep 2004 20:38

Re: Text in Diablo II ausgeben
 
Am Rande: Hier schribt jemand, wie man einen Screenshot einer DirectX-Anwendung machen kann. Könnte man das nicht irgendwie verwursten? Hab das mal testweise in Delphi übersetzt (versucht) aber überhaupt nicht kompiliert bekommen, da mir wohl die DirectX 8.0 Header fehlen. Bis 7 hab ich sie, und da kennen die verwendeten Interfaces die ganzen Methoden die der Code benutzt nicht :?

Zum Thema "Zerlegen" hatten wir hier schon massig Diskussionen Hier im Forum suchendisassembler Hier im Forum suchendecompiler. Lies es, und du wirst sehen, dass man das getrost vergessen kann ;)

c113plpbr 1. Sep 2004 20:44

Re: Text in Diablo II ausgeben
 
Die flackernde Variante ist schon möglich, da DirectX sowieso im Fenster läuft, welches ein DC hat, auf das man zeichnen kann (ich hab das selbst mal ausprobiert). Einfach per FindWindow sich ein fensterhandle holen, dann per GetDc den dc holen, und dann einfach per TextOut draufzeichnen. TextOut muss man dann in einer schleife recht oft aufrufen, um auf (möglichst) jeden frame den text zu zeichnen. Das funktioniert, aber wie gesagt, es flackert.

Um aber mit DirectX zu zeichnen, z.B. mit der DrawTextA funktion aus ID3DXFont braucht man zum erstellen der Font (bei dx9) ein IDirect3DDevice9. Ohne das, keine font. Und selbst dabei muss man auch noch im richtigen moment zeichnen, damit der text nicht wie bei obiger variante flackert. Daher ist API bzw. Function-Hooking die EINZIGE akzeptable methode (außer man versucht sich an einem Graphikkartentreiber).

Ich hab mir nun vorgenommen das angesprochene Tutorial zu schreiben, und dies mit einem beispiel auszustatten, das zeigt, wie das möglich ist. Ihr müsst nur ein wenig gedult haben ...

@dizzy: Genau den code hab ich verwendet, um screenshots zu machen ... allerdings ist der für eigene programme gedacht ... ^^

ciao, Philipp

SuPp3nHuHn 1. Sep 2004 20:47

Re: Text in Diablo II ausgeben
 
Jo, das hört sich schon sehr konkret an ;-)

Ja, das mit dem zerlegen weiß ich das es net wircklich effizient ist (wenn ich es zerlegen und das zerlegte zu 100% verstehen könnte würde ich wohl diablo einfach neu schreiben ^^)

Wie halt schon gesagt hab ich d2jsp und das hat auch eine dll, kann die diese nicht verwenden (copyright hab ich keine angst da es ja nur für mich + freundeskreis ist)

ahja, btw. bei d2jsp sieht es aus als wenn die nachricht vom server käme, wäre es evtl. nicht möglich einfach eine für diablo fingierte message zu schicken, also gar nicht diablos grafik selbst zu manipulieren sondern einfach über den port wo "der text kommt" an sich selbst quasi eine nachricht zu schreiben? Diablo würde diese dann ganz normal ausgeben.... (is nur so ein einfall)


Hier das mit dem DC .... geht nicht wircklich:

Delphi-Quellcode:
procedure TForm1.FWin;
var    W: HWnd;
        D: HDC;
        x: cardinal;
begin
  W := FindWindow(NIL,'Diablo II');
  if W<>0 then begin

  Status.Caption:='Fenster gefunden!'; status.Refresh;
  sleep(1000);
  x:=0;
  D := GetDeviceContext(W);

    while x < 150 do begin
  sleep(50);
  inc(x,1);
  TextOut(D,2,2,'FOUND',5);
  Status.Caption:='Output '+IntToStr(x); status.Refresh;
    end;

  Status.Caption:='Output done!'; status.Refresh;

  end else Status.Caption:='Fenster nicht gefunden'; status.Refresh;
end;
Das Program zeichnet immer auf sein eigenes Fenster anstatt auf notepad, den rechner oder diablo ...

c113plpbr 2. Sep 2004 11:57

Re: Text in Diablo II ausgeben
 
Wenn ich sage GetDC, dann meine ich auch GetDC ... also, ersetze mal dein GetDeviceContext durch GetDC!

ciao, Philipp

SuPp3nHuHn 2. Sep 2004 16:00

Re: Text in Diablo II ausgeben
 
jo hab es jetzt mit getdc und geht auch (die Hilfe schlug mir eben GetDeviceContext vor) ...

Aber die Möglichkeit dem Spiel eine Nachricht zu schicken wie als wenn Sie von dem Server käme wäre die nicht besser?
Weil mit OutputText is wie ja schon vorher bemerkt sehr flimmernd...

Dani 2. Sep 2004 16:57

Re: Text in Diablo II ausgeben
 
Gibts denn keine Möglichkeit, einen Thread in den Diablo II Prozess zu "schummeln" und dann damit auf die D2 Libraries (d2client.dll, d2game.dll usw.) zuzugreifen? Du bräuchtest halt die Namen der Funktionen, aber ich schätze mal da wirst du in den Cheaterforen schon fündig...

btw: Bei FindWindow lieber nach dem Klassennamen "Diablo II" suchen anstatt des Fenstertitels

c113plpbr 2. Sep 2004 18:10

Re: Text in Diablo II ausgeben
 
Zitat:

Zitat von Dani
Gibts denn keine Möglichkeit, einen Thread in den Diablo II Prozess zu "schummeln" und dann damit auf die D2 Libraries (d2client.dll, d2game.dll usw.) zuzugreifen? Du bräuchtest halt die Namen der Funktionen, aber ich schätze mal da wirst du in den Cheaterforen schon fündig...

Dass du da was findest, bezweifle ich ... da deren namen alle nicht wirklich "sichtbar" sind ... soweit ich das gesehen hab ... bis auf eine ... in der d2client.dll gibt es eine funktion, die QueryInterface heißt ... vielleicht nützlich?

egal, ich bleibe bei meiner methode ... ^^ ... und wer keine gedult hat ist selbst schuld ...

ciao, Philipp

PS: :pale: mein mund ... AUUUAAA! :pale:

SuPp3nHuHn 2. Sep 2004 18:32

Re: Text in Diablo II ausgeben
 
Zitat:

Zitat von Dani
Gibts denn keine Möglichkeit, einen Thread in den Diablo II Prozess zu "schummeln" und dann damit auf die D2 Libraries (d2client.dll, d2game.dll usw.) zuzugreifen? Du bräuchtest halt die Namen der Funktionen, aber ich schätze mal da wirst du in den Cheaterforen schon fündig...

btw: Bei FindWindow lieber nach dem Klassennamen "Diablo II" suchen anstatt des Fenstertitels

Glaub auch das dies viel schwerer ist als es anders zu probieren.

Wie such ich nach dem Klassennamen anstatt nach dem Fenstertitel?

Dani 2. Sep 2004 18:42

Re: Text in Diablo II ausgeben
 
Delphi-Quellcode:
 W := FindWindow('Diablo II', nil);


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:35 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz