Frage

Ich mag auf einer 3rd-Party-Vollbild-Windows-Anwendung, einige benutzerdefinierten Grafiken angezeigt werden.

Haben Sie keine Steam-Spiele gespielt? Es verfügt über eine ausführbare Datei, GameOverlayUI.exe auf die Sie zugreifen Dampf Fenster aus einem Spiel lässt. (Die GUI-Elemente aussehen individuell gezeichnet, ich weiß nicht, ob das eine Notwendigkeit, aber sie sehen genau gleich in einem Spiel, wie sie auf dem Desktop zu tun.) Es geht sogar so weit zu ‚verdunkeln‘ die Spielgrafik in der Hintergrund.

Ich frage mich, wie man über das Schreiben eine solche Anwendung gehen könnte.

Ich bin auch gefragt, wie breit der Anwendungsbereich der Lösungen wäre. Könnten Sie eine Methode für alle OpenGL-Anwendungen verwenden? Für alle Direct3D minus DirectDraw-Anwendungen? Für alle Vollbild-Windows-Anwendungen?

Ich suche nach mehr ‚modern‘ und generischen Lösungen - eine Eingabeaufforderung oder einen 320x240 indizierte Farbauftrag überlagert wird keine Sorge

.

Edit: Einige Klarstellung: Die Vollbild-Anwendung ist nicht meins. Es kann alles sein. Höchstwahrscheinlich wird es ein 3D-Spiel sein. Ich mag zeigen, sagt eine digitale Uhr in der rechten unteren Ecke des Bildschirms, auf der Oberseite der Spielgrafik. Ich möchte Tricks vermeiden, wie Code-Injektion oder den Prozess debuggen, wenn möglich.

War es hilfreich?

Lösung

Nun, hier ist ein weiteres Beispiel. Xfire ist ein Chat-Programm, das seine Schnittstelle in die Spiele überlagert, so dass Sie Nachrichten während der Wiedergabe empfangen können. Die Art, wie sie dies tun, ist durch die Bearbeitung der d3d / opengl DLL auf Prozessspeicherebene, wie Montage Injektion springt. Ich weiß das, weil ihre Methode meines mod zum Absturz verursacht wurde, und ich sah tatsächlich den seltsamen Assembler-Code sie in die d3d9.dll wurden injiziert wird.

Also hier ist, wie Xfire tut dies:

  1. Ziel, den Prozess des Spiels
  2. suchen ihre Prozessspeicher für d3d.dll / opengl.dll
  3. injizieren in den Prozess eine DLL, die benutzerdefinierte Schnittstelle Logik
  4. enthalten
  5. Schnittstelle Funktionen zum Programmablauf verbinden durch Montage von Hand zu schreiben springt in den d3d / OpenGL-Funktionen im Prozessspeicher gefunden

Es gibt keine andere denkbare Art und Weise, da Sie das Grafikgerät kapern müssen, die zu diesem Spiel gehört. Ich bin bereit, dass Dampf zu wetten, tut es die gleiche Art und Weise wie Xfire. Also ja, keine einfache Möglichkeit, dies zu tun, es sei denn, jemand eine hilfreiche Bibliothek erstellt alles, was Sie auf dem niedrigen Niveau tun müssen, tun.

Sie auch gefragt, über die Spielgrafik unter Overlay dimmen. Dies ist nur ein einfacher DrawPrimitive Anruf ein gefülltes transparentes Rechteck über den Bildschirm zu zeichnen.

Andere Tipps

Erstellt ein Gist mit vollständigem Code hier

Dies ist eine ziemlich esoterische Kunst, und es gibt mehr Möglichkeiten, dies zu tun. Ich ziehe es, was ein Direct3D Wrapper genannt wird. Es ist Jahre her, dass ich das getan habe, aber ich habe es mit einem Spiel einmal. Ich habe vielleicht einige Details ausgelassen, aber ich hoffe nur, die Idee zu illustrieren.

Alle Direct3D9 Spiele aufrufen müssen IDirect3DDevice9 :: EndScene nachdem der Bildschirm wiedergegeben wird und bereit zu ziehen. Also in der Theorie können wir benutzerdefinierten Code in EndScene setzen, das zieht, was wir über das Spiel wollen. Wir tun dies durch Erstellen einer Klasse, die wie IDirect3DDevice9, um das Spiel aussieht, aber es ist wirklich nur ein Wrapper, der alle Funktionsaufrufe an die Realklasse leitet. So, jetzt in unserer eigenen Klasse, unsere Wrapper-Funktion für EndScene wie folgt aussieht:

HRESULT IDirect3DDevice9::EndScene()
{
   // draw overlays here

   realDevice.EndScene();
}

Dann erstellen wir es in eine DLL namens d3d9.dll, und legen Sie es in das Verzeichnis des Spiel ausführbare Datei. Die wirkliche d3d9.dll sollte im / System32 Ordner befindet, aber das Spiel sieht zunächst im aktuellen Verzeichnis, und stattdessen lädt uns. Sobald das Spiel geladen, verwendet es unsere DLL eine Instanz unserer Wrapper-Klasse zu erstellen. Und jetzt jedes Mal EndScene genannt wird, wird unser Code ausgeführt zu zeichnen, was wir auf dem Bildschirm wollen.

Ich glaube, Sie das gleiche Prinzip mit OpenGL ausprobieren können. Aber zu Manipulationen zu verhindern, glaube ich einige moderne Spiele versuchen, dies zu verhindern.

therers ein freies Software-Projekt seinen Namen, es ist taksi Link-Text . ich bin nicht sicher, wie diese Anwendung des Prozesses außer Kraft setzen, weil ich den Code noch werde sich die Prüfung aber checkit Ich denke, das ein gutes Projekt ist

Ich habe darüber nachgedacht. Für OpenGL, würde ich WGL dem SwapBuffers mit Detours, zeichne meine Sachen nach dem Spiel Haken und dann Puffer selbst austauschen.

Ich habe getan, Overlays mit DirectX & WPF Ansichtsfenstern (gleiche Sache, wirklich), die Überlagerung mit einem paar netten 2D-GDI + Sachen oben auf 3D-Visualisierungen zu malen.

ich es geschafft, durch ein Panel auf der Oberseite der „tatsächlichen“ Visualisierung, um die Farbe transparent Einstellung mit Ausnahme der Bits I überlagert wollte. Funktionierte ziemlich gut, aber es war Klick, ein bisschen Schmerz vorbei ziehen, und andere Veranstaltungen durch die „Zeichnung“ Schicht auf die 3D-Steuerung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top