c# directx

c# - Captura la salida visual de una aplicación DirectX, incluso en segundo plano?



(3)

Necesito capturar la salida visual (como una captura de pantalla) de una ventana de DirectX. Actualmente, utilizo este enfoque .
Pero, cuando la ventana está en el fondo, captura todo lo que está delante de ella.

Veo que las ventanas de DirectX se procesan incluso cuando están minimizadas o en segundo plano, por lo que debería ser posible.
¿Pero cómo? (También debe ser rápido, y también debe funcionar en Windows XP, desafortunadamente ...)

Edit : estoy muy ocupado estos días ... No te preocupes, devolveré la recompensa si caduca.


El código al que vinculó (de spazzarama), que dijo que estaba usando en su proyecto, captura el búfer frontal de su dispositivo DirectX. ¿Has intentado capturar el búfer trasero en su lugar? Partiendo del código de su sitio vinculado, cambiaría la línea 90 de

device.GetFrontBufferData(0, surface);

a

Surface backbuffer = device.GetBackBuffer(0, 0, BackBufferType.Mono); SurfaceLoader.Save("Screenshot.bmp", ImageFileFormat.Bmp, backbuffer);

Esto también implicaría eliminar las líneas 96-98 en su ejemplo vinculado. El backbuffer podría generarse sin la ventana de obstrucción.

EDITAR

No importa todo eso. Acabo de darme cuenta de que su código de ejemplo vinculado está utilizando el identificador de ventana para definir una región de la pantalla y, en realidad, no está haciendo nada con la ventana de DirectX. Su código de muestra no funcionará alrededor de la obstrucción porque su región ya está dibujada con la otra ventana delante de ella cuando la acceda.

Su mejor apuesta para salvar la aplicación es probablemente llevar la ventana de DirectX a la parte superior de la pantalla antes de ejecutar el código para capturar la imagen. Puede usar la función Wind32API BringWindowToTop para hacerlo ( http://msdn.microsoft.com/en-us/library/ms632673%28VS.85%29.aspx ).


Para capturar ventanas de Direct3D que están en segundo plano (o que se han movido fuera de la pantalla), creo que tiene las siguientes opciones:

  1. Inyecte y enganche Direct3D dentro de la aplicación de destino a través del enlace que ya ha publicado o este ejemplo más actualizado (EasyHook puede ser difícil de configurar pero funciona realmente bien): siempre puede pedir ayuda para que funcione. . He usado esa técnica para capturar en una serie de juegos sin problemas (más recientemente para un proyecto de clon de ambilight). El problema con este enfoque es su preocupación por la protección del juego que causa las prohibiciones, sin embargo, los FRAP también usan el enganche para lograr esto, ¿entonces tal vez sus preocupaciones son exageradas? Supongo que los jugadores que están prohibidos para una captura de pantalla es una forma costosa de averiguarlo.

  2. Para aplicaciones de ventana en Vista / Win 7, puede inyectar y conectar el DWM y hacer sus solicitudes de captura a través de su superficie compartida. He tenido este trabajo en Vista , pero no he terminado de hacerlo en Windows 7, aquí hay un ejemplo de cómo funciona para Windows 7 http://www.youtube.com/watch?v=G75WKeXqXkc . El principal problema con este enfoque es el uso de APIs no documentadas, lo que podría significar que su aplicación se rompa sin ninguna advertencia en el lanzamiento de un parche de Windows; también tendría que rehacer la técnica para cada nueva versión principal de Windows. Esto tampoco cubre su necesidad de capturar en Windows XP.

  3. También dentro del DWM, hay una API de miniaturas. Esto tiene limitaciones dependiendo de lo que intenta hacer. Hay información sobre esta API junto con otras API de DWM aquí http://blogs.msdn.com/b/greg_schechter/archive/2006/09/14/753605.aspx

  4. Existen otras técnicas para interceptar las llamadas de Direct3D sin usar EasyHook, como sustituir las distintas DLL con envoltorios. Encontrará varias otras técnicas de intercepción / enganche de juegos aquí: http://www.gamedeception.net/

  5. Simplemente lleve la aplicación Direct3D al primer plano (lo que supongo que no es deseable en su situación), esto no funcionaría para ventanas fuera de pantalla a menos que también mueva la ventana.

  6. Desafortunadamente, la única solución para Windows XP en la que puedo pensar es interceptar la API Direct3D de alguna forma.

Solo una aclaración sobre la representación de Direct3D mientras está minimizada. Durante mis pruebas bastante limitadas sobre este asunto, he encontrado que esto depende de la aplicación; en general, no se recomienda que la renderización se realice mientras la aplicación está minimizada (también en esta reference ), sin embargo, la renderización continúa en segundo plano.

ACTUALIZADO : proporcionó un enlace adicional a un ejemplo de inyección más actualizado para el punto 1.


Un rápido google y encontré este proyecto de código que se relaciona con Windows XP. No sé si puedes aplicar este conocimiento a Windows Vista y 7?

http://www.codeproject.com/Articles/5051/Various-methods-for-capturing-the-screen

EDITAR:

Encontré este artículo también:

http://www.codeproject.com/Articles/20651/Capturing-Minimized-Window-A-Kid-s-Trick

Esto enlaza desde la publicación del blog de Justins aquí a partir de los comentarios. Parece que estaba trabajando en esto con alguien (veo que ese es tu enlace).

http://spazzarama.com/2009/02/07/screencapture-with-direct3d/