Entwickler-Ecke

Multimedia / Grafik - [DirectX, OpenGL,...] Einen Screen Overlay erstellen


alias5000 - Do 22.02.07 22:54
Titel: [DirectX, OpenGL,...] Einen Screen Overlay erstellen
Hi!
Ich weiß, das Thema wird wahrscheinlich etwas kniffelig. Aber es interessiert mich doch. Und zwar würde ich gerne für meinen LanChat2 TBX ein Fenster erstellen, dass immer oben bleibt, auch bei Spielen, damit man ständig chatten kann, wenn man will. Mit so einfachen Mitteln, wie FormStyle := fsStayOnTop ist das nicht zu realisieren.
Wie könnte ich so ein Overlay Fenster erstellen?
Dieser Thread [http://forum.qbnut.com/viewtopic.php?t=277] gibt Ansatzpunkte (Hooken von DirectX), aber auch an, dass Quellen im Internet existieren. In dem Thread kann ich leider nicht mehr antworten, ich habe jetzt einfach mal ne PN verschickt.
Trotzdem, da es laut SB auch andere zu interessieren scheint, kennt jemand Quellen, woher ich das Wissen bekommen, dieses Overlay zu erstellen, ohne das ganze MSDN durchlesen zu müssen^^?
(oder gibts sowas etwa schon fertig? glaube ich wohl kaum^^)

Gruß
alias5000

Moderiert von user profile iconChristian S.: url-Tag repariert


Sinspin - Fr 23.02.07 01:15

geniale Idee!


Delphi-Quelltext
1:
Application.BringToFront()                    


Ist leider Momentan das einzige was mir einfällt.
Gesehen habe ich sowas jedenfalls schon. Auch bei directx nutzenden Spielen.


GTA-Place - Fr 23.02.07 08:39

Aber pass auf dabei, dass z.B. Steam es nicht als Cheat erkennt.


Lossy eX - Fr 23.02.07 09:10

Alias: Das Programm worüber qbnut in deinem Link redet ist TeamSpeak Overlay. Die machen etwas anderes als was du da vielleicht denkst. Ja die Hooken Direct3D. Aber die haben kein eigenes Fenster. Die benutzen das gerade aktive Direct3D und rendern selber per Hand ihre Texte. Mehr ist das bei TSO nicht. Vergleichbar mit dem was Fraps macht. Komplexer und eher das was du suchst ist wohl xfire [http://de.xfire.com/]. Meine ich zu mindest. Aber habe es nie probiert. Davon gibt es natürlich keine Quellen.

Ich hatte da auch schon mal nach Quellen gesucht. Konnte so aber keine finden. Etwas was aber in jedem Fall in diese Richtung geht ist auf der Homepage von Michael Puff [http://www.michael-puff.de/dirindex.php?folder=Developer/Delphi/Importe/toms/] zu finden. Damit bräuchtest du in OpenGL zu mindest lediglich das SwapBuffers hooken und würdest vor dem Swappen dein eigenes Zeug zeichnen.

Du müsstest diesen Hook allerdings als globalen Hook in eine DLL Packen, da es sonst nicht Anwendungsübergreifen funktionieren würde.

Habe mich aber nach dem Finden des Codes nicht wirklich wesentlich weiter damit beschäftigt. Aber eines weiß ich. Es ist definitiv nicht mal eben so recht einfach gemacht. Hinter dem ganzen Steckt ein richtig gehöriger Aufwand. Vor allem, da du in deinem Messanger ja auch noch interaktion benötigen würdest.


alias5000 - Fr 23.02.07 11:20

Jap, das merke ich auch grad. Das Application.BringToFront bringt ja sicher nix, das wusste ich schon. Das Spiel darf ja an sich den Fokus nicht verlieren.
Dass das Programm nicht als Cheat entlarvt wird, ist sicher noch eine zusätzliche Hürde.

Schade, ich hab das schon geahnt, dass das sowas kompliziertes ist. Ich schreibe mir die Idee aber weiter auf, Interessant ist sie ja. Werde das weiter verfolgen und mich v.a. dann ein bisschen kräftiger in DirectX/3D einarbeiten müssen^^

Gruß
alias5000


Martok - Fr 23.02.07 11:33

Eine andere Möglichkeit wäre auch, nur das Zeichen zu hooken (zumindest bei OGL, wie Lossy schon schreibt), unddie Texteingabe über einen globalen Keyboard-Hook zu machen. Beispiel:

Programm "schläft"
Tastenkombination->Overlay anzeigen
Tastenkombination->Eingabe beginnen
Text eingeben, Hook schreibt in Puffer, der als Text gerendert wird
Tastenkombi->Senden
Tastenkombination->Overlay verstecken
Programm "schläft" wieder

Wobei Beginnen und Senden durchaus das gleiche sein könnte, was dann anhand des schon eingegebenen erkannt wird, ob das neu ist oder der 'Senden'-Befehl.