2010-02-09 20 views
5

Me gustaría renderizar una sola imagen con DirectX. Debería funcionar de forma similar a la "salida de video directx" del reproductor VLC, si no fuera posible capturar un fotograma utilizando un software de captura de pantalla simple o la tecla de pantalla de impresión. ¡No debería ser posible (o muy difícil) hacer una captura de pantalla!Impedir la captura de pantalla con DirectX

¿Alguien sabe cómo funciona esto en el reproductor VLC?

¿Hay alguna otra solución posible? Tal vez con "Output Protection Manager" (vea http://msdn.microsoft.com/en-us/library/dd388980(VS.85).aspx)

Tengo alrededor de 3 años de experiencia en la programación de C# en la escuela. También he hecho algo de programación en C++, pero preferiría una solución de C# quizás usando WPF o Managed DirectX.

Perdón por mi inglés y gracias por su ayuda con anticipación !!!

Respuesta

1

Tal vez por el sonido de que necesita interceptar WM_PRINTCLIENT enganchando en un procedimiento global de Windows, si se utiliza el mensaje WM_PRINTCLIENT, simplemente regrese del procedimiento de la ventana enganchada. Consulte aquí para obtener información detallada de Feng Yuan sobre WM_PRINTCLIENT. La otra forma de hacerlo es interceptar las funciones del portapapeles donde los datos provienen de una aplicación en particular y el portapapeles contiene un mapa de bits. Consulte el blog de Larry Osterman sobre this. Aquí hay un artículo en CodeProject que implementa un gancho de Windows global, hay otros dos enlaces que podría suministrar here y here. (Todo en CodeProject)

Espero que esto ayude, Saludos cordiales, Tom.

+0

Intenté cumplir con WM_PRINTCLIENT pero nunca recibí el mensaje WM_PRINTCLIENT. he utilizado la protegida override void WndProc (ref mensaje m) de la ventana principal en mi solicitud Interceptar functios del portapapeles no funciona debido a la captura de pantalla de software no siempre segura el mapa de bits de captura al portapapeles (ver Windows 7 Snipping Tool Options por ejemplo). – raisyn

+0

@youllknow: Si miras el último enlace para CodeProject, hay un gancho para el portapapeles ... Como no tengo Windows 7 no puedo decir cómo funciona ... :) – t0mm13b

+0

Sí, pero hay una pantalla el software de captura (por ejemplo, Snipping Tool) no usa el portapapeles. ¡Entonces el gancho nunca se ejecutará! ¡Pero gracias por su ayuda! – raisyn

6

En primer lugar, la razón por la cual el contenido de VLC no se captura al usar printscreen u otras técnicas de captura de pantalla es porque (al menos en versiones anteriores de Windows) están usando una 'superposición' para presentar el video. Esta es una construcción especial de GPU que permite la representación en un 'plano' virtual sobre la superficie de la pantalla normal. Como esto pasa por alto todo lo demás y va directamente a la GPU, no hay una forma directa de capturarlo. NOTA: en las últimas versiones de Windows, las reglas cambiaron bastante en cuanto a las superposiciones. Las aplicaciones no pueden suponer que las superposiciones D3D9/DDraw son compatibles y las aplicaciones no deberían usarlas hoy en día, ya que el sistema tiene métodos mucho mejores para presentar contenido con el mismo alto rendimiento.

Direct3D 9 superposiciones

Si está mostrando el contenido de vídeo usando Direct3D 9, usted también puede utilizar una superposición. Consulte this page on MSDN para obtener información sobre cómo hacerlo. Existen muchas restricciones sobre el uso de las superposiciones D3D9 y no son compatibles con una gran cantidad de hardware, por lo que describiré algunos otros enfoques.

Esta técnica no evita que otras aplicaciones las inyecten en su espacio de direcciones y capturen sus regalos. Además, debido a que no es compatible con algunos hardware y algunas API de captura realmente desactivan las superposiciones, no ofrece garantías de protección muy fuertes.

GPU basada en la protección de contenido

Si usted tiene un montón de tiempo para aprender acerca de la protección del contenido de la GPU y que sabe que va a exhibiendo un formato de vídeo protegido por DRM no estándar, puede rodar su propia ruta de medios protegida utilizando protección de contenido GPU. No soy un experto en esta área, y hay pocos que lo son. No recomendaría esto, pero quería señalarlo.This page on MSDN habla de cómo se implementa en Direct3D 9 y this other page habla de cómo se implementa usando Direct3D 11.

Esta técnica proporciona fuertes garantiza que el contenido no ha sido capturado, ya que el intercambio de claves sucede casi en su totalidad a través de hardware (por ejemplo, HDCP).

Fundación de Medios recorrido del papel Protegida (PMP)

Si está visualizando vídeo utilizando un formato de medios basados ​​en DRM bien soportado, puede utilizar recorrido del papel protegida de Media Foundation, que hace uso de la GPU- protección basada en contenido descrita anteriormente. También encapsula la mayor parte de la funcionalidad en un proceso protegido separado que otras aplicaciones no pueden interceptar o interactuar de otra manera. Si alguien intenta instalar un controlador firmado por prueba o inyectar un código binario que no está firmado por una autoridad raíz de confianza, Windows no permitirá que se descifre el contenido y su contenido permanecerá seguro. Esta técnica proporciona strong garantiza que el contenido no se ha capturado. Esto es utilizado por Netflix en Windows, reproductores Blueray y otros.

DXGI Banderas de cadena de intercambio

Suponiendo que está presente contenidos usando Direct3D 10.x/11.x (y es de esperar que ahora son, en contraposición a D3D 9, en el año 2014), se puede utilizar una número de banderas en su cadena de intercambio para bloquear su contenido.

Puede pasar DXGI_SWAP_CHAIN_FLAG_RESTRICTED_CONTENT en los indicadores de la cadena de intercambio para no generar la cadena de intercambio si el sistema no tiene protección de salida HDCP o similar a HDCP. Probablemente esto no sea necesario para sus propósitos, pero es bueno si está preocupado por las personas que capturan la salida HDMI o analógica.

La bandera que definitivamente quiere se llama DXGI_SWAP_CHAIN_FLAG_DISPLAY_ONLY. Esto evita que todas las API de captura de pantalla vean su cadena de intercambio. Simplemente aparecerá como un rectángulo negro para ellos.

Vea this page para todas las banderas de la cadena de intercambio DXGI.

Esta técnica no ofrece las garantías sólidas que proporciona la protección de contenido basada en GPU, pero si tiene bastante confianza de que otras aplicaciones no están haciendo cosas alocadas como inyectarse en su espacio de direcciones y conectar sus llamadas actuales, Puede estar seguro de que esto evita que otra persona vea su contenido (excepto el monitor, por supuesto).

completo Ventana Protección

A veces es posible que desee proteger a más de contenido acaba de presentar-DXGI. En ese caso, puedes usar un mecanismo similar para simplemente proteger una ventana completa de ser capturada por varias técnicas de captura de pantalla. Es una API llamada SetWindowDisplayAffinity. Es equivalente en fuerza y ​​funcionalidad a pasar el indicador DXGI_SWAP_CHAIN_FLAG_DISPLAY_ONLY para una cadena de intercambio, pero también protege el contenido presentado con GDI, tecnologías DirectX anteriores, etc. Pase el indicador WDA_MONITOR para habilitar la protección para un HWND determinado, o pase WDA_NONE para desactivar la protección .

Para una divulgación completa, trabajo en Microsoft en el equipo que maneja la lógica de visualización, incluidas algunas formas de captura de pantalla y protección de contenido.

Cuestiones relacionadas