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.
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
@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
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