Overlay mittels dllinjection - klappt flimmert aber

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
benji
Beiträge: 124
Registriert: 01.11.2006 20:23

Overlay mittels dllinjection - klappt flimmert aber

Beitrag von benji »

Heyho!
ich weiß, die frage wurde schon oft gestellt...
aber bei mir ists etwas anders:
Ich habe bereits einen overlay in das fremde spiel zeichnen können, jedoch flimmert das Bild.

die dll die injected wird hat folgenden test code:

Code: Alles auswählen

Procedure draw()
  direction = 2
  Repeat
    ; Es ist sehr wichtig, alle im Queue befindlichen Ereignisse während jedes Frames abzuarbeiten
    ;  
    FlipBuffers(2) 
    ClearScreen(RGB(0, 0, 0))
    DisplaySprite(0, x, x)
    x + direction
    If x > 140 : direction = -2 : EndIf
    If x < 0   : direction =  2 : EndIf
    Delay(1)
  ForEver
EndProcedure  
    If InitSprite() = 0
    MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)

  EndIf
  
  Handle = FindWindow_(#NUL, "METIN2")
  
    If OpenWindowedScreen(Handle, 0, 0, 160, 160, 0, 0, 0)
      CreateSprite(0, 20, 20)
      If StartDrawing(SpriteOutput(0))
        Box(0, 0, 20, 20, RGB(255, 0, 155))
        Box(5, 5, 10, 10, RGB(155, 0, 255))
        StopDrawing()
      EndIf
      EndIf
      
  CreateThread(@draw(),0)
Ich nehme an, dass ich DX Hooken muss um gleichzeitig mit Flip() dann auch nen FlipBuffers() ausführen zu lassen - stimmts?
Hat wer ne idee?

ich danke wie immer für die hoffentlich nicht ausbleibende kompetente Hilfe :) :allright:
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

Sollte irgendwie so funktionieren, oder?

Code: Alles auswählen

Procedure draw()
  direction = 2
  Repeat
    ; Es ist sehr wichtig, alle im Queue befindlichen Ereignisse während jedes Frames abzuarbeiten
    ; 
    FlipBuffers(2)
    ClearScreen(RGB(0, 0, 0))
    DisplaySprite(0, x, x)
    x + direction
    If x > 140 : direction = -2 : EndIf
    If x < 0   : direction =  2 : EndIf
    Delay(1)
  ForEver
EndProcedure 
    If InitSprite() = 0
    MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)

  EndIf
 
  Handle = FindWindow_(#NUL, "Unbenannt - Editor")
  SetForegroundWindow_(Handle)
 
    If OpenWindowedScreen(Handle, 0, 0, 160, 160, 0, 0, 0)
      CreateSprite(0, 20, 20)
      If StartDrawing(SpriteOutput(0))
        Box(0, 0, 20, 20, RGB(255, 0, 155))
        Box(5, 5, 10, 10, RGB(155, 0, 255))
        StopDrawing()
      EndIf
      EndIf
     
  CreateThread(@draw(),0)
  
  Repeat
  	Delay(10)
  	SendMessage_(Handle,#PB_Event_Repaint,0,0)
  ForEver
das sollte die zurückgebliebenen zeichnungen überschreiben.
Benutzeravatar
benji
Beiträge: 124
Registriert: 01.11.2006 20:23

Beitrag von benji »

hum...
das game crashed wenn ich deinen code injecte...
allerdings handelt es sich bei dem spiel um ein 3D game mit engine usw... vllt ist das das problem
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

<OT>
Andreas_S hat geschrieben:

Code: Alles auswählen

Procedure draw()
[...]
  CreateThread(@draw(),0)
Bitte immer daran denken, dass Thread-Procs immer ein
(Dummy-)-Parameter übergeben werden sollte.

</OT>

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
benji
Beiträge: 124
Registriert: 01.11.2006 20:23

Beitrag von benji »

Kiffi hat geschrieben:<OT>
Andreas_S hat geschrieben:

Code: Alles auswählen

Procedure draw()
[...]
  CreateThread(@draw(),0)
Bitte immer daran denken, dass Thread-Procs immer ein
(Dummy-)-Parameter übergeben werden sollte.

</OT>

Grüße ... Kiffi
oke^^
das ändert aber nicht wirklich was an meinem problem ne? xD
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

benji hat geschrieben:das ändert aber nicht wirklich was an meinem problem ne? xD
deshalb ist es ja auch <O(ff)T(opic)>-geklammert.

Wie auch immer: Es kann helfen, Dir zukünftige Probleme zu ersparen. ;-)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
benji
Beiträge: 124
Registriert: 01.11.2006 20:23

Beitrag von benji »

Kiffi hat geschrieben:
benji hat geschrieben:das ändert aber nicht wirklich was an meinem problem ne? xD
deshalb ist es ja auch <O(ff)T(opic)>-geklammert.

Wie auch immer: Es kann helfen, Dir zukünftige Probleme zu ersparen. ;-)

Grüße ... Kiffi
schon klar, danke auf jedenfall mal ^^
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag von real »

@benji:
Du musst Present() hooken, um VOR dem Flip - also bevor der Backbuffer zum Frontbuffer wird - deine Dinge in den Backbuffer zu schreiben. Da DirectX auf COM basiert, musst du dich in das Hooking von COM einarbeiten. Leider kann ich dir nicht mehr dazu sagen, weil ich das irgendwann aufgegeben hab (mein kleines Projekt war mir einfach nicht wichtig genug bzw. ich hatte keine Lust, mich tiefer darin einzuarbeiten).

Hier aber zwei interessante Links dazu:
http://www.gamedev.net/community/forums ... _id=359794
http://www.ring3circus.com/gameprogramm ... -viewport/[/b]
Benutzeravatar
benji
Beiträge: 124
Registriert: 01.11.2006 20:23

Beitrag von benji »

super danke^^
dann schreib ich meine dll vllt lieber mit Cpp...
oder ich übersetze sie mal ;)
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Beitrag von Blackskyliner »

Interessanter wäre es wenn du es mit PB schaffst und endlich ein Funktionsfähiger Code für so was existieren würde :)
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
Antworten