Erfassung der visuellen Ausgabe einer DirectX-Anwendung - auch im Hintergrund?
Mich bannen zu müssen die visual-Ausgang (wie ein screenshot) von einem DirectX-Fenster.
Derzeit nutze ich dieser Ansatz.
Aber, wenn das Fenster im hintergrund, es fängt was vor.
Sehe ich, dass DirectX von windows gerendert, auch wenn es minimiert oder im hintergrund, so sollte dies möglich sein.
Aber, wie? (Es muss auch schnell sein, und es muss auf Windows XP arbeiten auch, leider...)
Bearbeiten: ich bin sehr beschäftigt diese Tage... Mach dir keine sorgen, ich werde das Kopfgeld zurück, wenn es abgelaufen ist.
InformationsquelleAutor der Frage Vercas | 2012-04-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zu erfassen, Direct3D, windows, die im hintergrund (oder vom Bildschirm entfernt), ich glaube, Sie haben die folgenden Optionen:
Injizieren und Haken Direct3D, innerhalb der Ziel-Anwendung über den link Sie haben bereits gebucht, oder diese mehr up-to-date-Beispiel (EasyHook schwierig sein kann, um die Einrichtung zu erhalten, aber es funktioniert wirklich gut) - kann man immer um Hilfe bitten darum, es funktioniert. Ich habe verwendet diese Technik für die Erfassung in einer Reihe von spielen, ohne Probleme (zuletzt für ein ambilight-Klon-Projekt). Das problem mit diesem Ansatz ist es Ihr Anliegen über das Spiel Schutz verursacht Verbote, aber FRAPs nutzt auch Einhaken um dies zu erreichen, so vielleicht Ihre sorgen übertrieben? Ich denke, Gamer gebannt für einen screen-shot ist ein teurer Weg, um herauszufinden.
Für Fenster-Anwendungen auf Vista/Win 7 - Sie könnten Spritzen und der Haken bei DWM und machen Sie Ihre Aufnahme-Anforderungen durch Ihre gemeinsame Oberfläche. Ich habe dieses funktioniert auf Vistaaber nicht zu Ende bekommen, es funktioniert auf Windows 7, hier ist ein Beispiel, dass es funktioniert für Windows 7 http://www.youtube.com/watch?v=G75WKeXqXkc. Das Hauptproblem bei diesem Ansatz ist die Verwendung von undokumentierten API, die könnte bedeuten, dass Ihre Anwendung bricht ohne Warnung auf einem windows-patch-release - auch Sie haben würde, um die redo-Technik für jede neue major-Windows Geschmack. Das auch der nicht-Adresse, Ihren Bedarf zu erfassen, der in Windows XP.
Auch innerhalb der DWM, es ist ein thumbnail-API. Dies hat Einschränkungen, je nachdem, was Sie zu tun versuchen. Es gibt einige Informationen über diese API-zusammen mit anderen DWM-API ' s hier http://blogs.msdn.com/b/greg_schechter/archive/2006/09/14/753605.aspx
Gibt es auch andere Techniken zum abfangen des Direct3D-Aufrufe ohne mit EasyHook, wie setzt man die verschiedenen DLL mit Wrapper. Sie finden verschiedene andere Spiel Einhaken/abfangen Techniken hier: http://www.gamedeception.net/
Bringen Sie einfach die Direct3D-Anwendung in den Vordergrund geholt (ich glaube, das ist unerwünscht in Ihrer situation) - würde dies nicht funktionieren, für off-screen-windows, es sei denn Sie auch das Fenster verschieben.
Leider die einzige Lösung für Windows XP, die ich denken kann, ist das abfangen der Direct3D-API in irgendeiner form.
Nur eine Klarstellung auf Direct3D-rendering, während minimiert. Während meine ziemlich begrenzten Prüfung auf diese Angelegenheit habe ich festgestellt, dass dies Anwendung abhängig; es ist in der Regel nicht zu empfehlen , rendering, während die Anwendung minimiert ist (auch dies Referenz), es tut sich fortsetzen, während im hintergrund allerdings.
AKTUALISIERT: zusätzlich zur Verfügung gestellten link, um mehr up-to-date-injection-Beispiel für Punkt 1.
InformationsquelleAutor der Antwort Justin Stenning
Eine schnelle google, und ich fand das Code-Projekt, das bezieht sich auf Windows XP. Ich weiß nicht, ob Sie können dieses wissen anwenden, um Windows Vista und 7??
http://www.codeproject.com/Articles/5051/Various-methods-for-capturing-the-screen
EDIT:
Fand ich diesen Artikel:
http://www.codeproject.com/Articles/20651/Capturing-Minimized-Window-A-Kid-s-Trick
Diese links aus Justins blog-post hier aus den Kommentaren. Es scheint, war er mit dieser Arbeit mit jemandem (ich sehe das ist dein link über).
http://spazzarama.com/2009/02/07/screencapture-with-direct3d/
InformationsquelleAutor der Antwort garfbradaz
Den code, den Sie im Zusammenhang mit (aus spazzarama), die Sie sagten, Sie verwenden in Ihrem Projekt erfasst die vorderen Puffer des DirectX-Geräts. Haben Sie versucht, die Erfassung der back-buffer statt? Werde aus den code auf deiner verlinkten Seite, Sie würde sich ändern, Zeile 90 von
Gerät.GetFrontBufferData(0, Oberfläche);
zu
Oberfläche backbuffer = Gerät.GetBackBuffer(0, 0, BackBufferType.Mono);
SurfaceLoader.Speichern("Screenshot.bmp", ImageFileFormat.Bmp, backbuffer);
Dies würde auch das entfernen von Zeilen 96-98 in deinem verlinkten Beispiel. Der backbuffer erzeugt werden könnte, ohne die Behinderung Fenster.
BEARBEITEN
Nevermind. Ich habe gerade festgestellt, dass Ihre verlinkten Beispiel-code ist mit dem Fenster-handle zu definieren, eine region auf dem Bildschirm, und nicht eigentlich etwas zu tun mit dem DirectX-Fenster. Dein Beispielcode funktioniert nicht um das Hindernis, weil Ihre region ist bereits gezogen, mit der anderen Fenster vor ihm durch die Zeit, die Sie darauf zugreifen.
Ihre beste Wette, um zu retten, die Anwendung wird wahrscheinlich bringen Sie das DirectX-Fenster an den oberen Rand des Bildschirms, bevor der code ausgeführt wird, um das Bild aufzunehmen. Sie können die Wind32API BringWindowToTop-Funktion zu tun (http://msdn.microsoft.com/en-us/library/ms632673%28VS.85%29.aspx).
InformationsquelleAutor der Antwort Jim