2009-04-21 17 views
5

Estoy escribiendo una aplicación de Windows. ¿Cómo puedo saber cuándo se está tomando una captura de pantalla? Leí acerca de cómo detectar la tecla de acceso directo que se está presionando, pero estoy más preocupado por el caso en el que cada 100 ms más o menos otro programa está tomando capturas de pantalla de la misma. A saber, trato de darme cuenta cuando alguien crea otro programa (por ejemplo, uno de Python usando ImageGrab, como se menciona en otra publicación) que constantemente toma capturas de pantalla de mi aplicación y las usa para leer información de ella.Detectar cuando los usuarios toman capturas de pantalla de mi programa

No me importa mucho evitar que se tomen las capturas de pantalla. Puedo prohibir al usuario una vez que se note este comportamiento.

¿Esto es posible? ¿Se envía un mensaje de Windows cuando una aplicación toma una captura de pantalla, como con WM_HOTKEY? ¿O Windows simplemente usa la información más reciente de los últimos eventos de pintura, y la devuelve al otro programa directamente, sin que mi aplicación lo note?

+0

¿Quieres prohibir las personas que toman capturas de pantalla de tu aplicación? – jjnguy

+0

Muy relacionado: http://stackoverflow.com/questions/767212/programattically-taking-screenshots-in-windows-without-the-application-noticing –

+0

@jinguy: esto sería muy útil para una aplicación que muestra datos confidenciales ... –

Respuesta

27

Hagas lo que hagas, la gente encontrará una forma de evitarlo. Supongamos que existe un método de este tipo, donde puede detectar de forma fiable otro programa que tome una captura de pantalla de su aplicación. Para evitarlo, podría instalar VirtualBox, ejecutar su aplicación dentro de la máquina virtual y luego hacer que un programa tome capturas de pantalla de VirtualBox (que luego contiene su aplicación). Su aplicación no tendría absolutamente ninguna forma de saber que se estaba tomando una foto.

+0

A menos que VirtualBox simule tomar capturas de pantalla de la misma manera que windows. De su respuesta, ¿está diciendo que no? – Claudiu

+0

No estoy hablando de VirtualBox tomando la captura de pantalla; Estoy hablando de otro programa que toma una captura de pantalla * de * VirtualBox. Después de todo, VirtualBox es básicamente una ventana con algunos píxeles. –

+0

Esto es lo que quise decir. En mi cabeza, se llama a cierta función cuando se llama a "takeScreenshot()". Esta función llamaría recursivamente a "takeScreenshot()" de todas las ventanas abiertas (para que el Escritorio lo llame a todos los programas con ventanas abiertas). VirtualBox podría definir su controlador para "takeScreenshot()" para simular llamar a esto "takeScreenshot()" en todas las aplicaciones que está simulando. No estoy seguro de que así sea como funciona, y es por eso que estoy preguntando aquí. – Claudiu

7

¿Qué sucede si utilizo una cámara de video? ¿Qué pasa si capturo el video que viene entre la computadora y el monitor?

Me sorprenderá saber que hay una forma práctica de hacerlo.

+11

sigue trabajando en ese prototipo de brazo biónico que se disfrazará como un dongle de licencia! Simplemente estrangulará al usuario si intenta usar una cámara de vídeo o una cámara. –

+1

+1 para Dr.Maldad por realmente hacerme reír – Tokk

1

La manera en que generalmente tomo capturas de pantalla (desde C#) es llamando a BitBlt, que es la base de mucha pintura de pantalla. No estoy seguro de cómo interceptarías las llamadas de forma significativa, ya que probablemente todos los programas del sistema lo utilicen a un nivel bajo.

+0

He visto un código de prueba de concepto en un programa de trampas para tiradores en primera persona, que congeló el hilo de captura de pantalla hasta que el truco HUD fue desactivado. Creo que enganchó BitBlt o algo similar. –

2

Es bastante difícil detenerlo por completo ... Un usuario que está lo suficientemente determinado podría simplemente tomar una foto de la pantalla con una cámara digital.

1

Supongo que realmente no se puede porque uno siempre puede ejecutar su programa en una ventana con máquina virtual, luego usar un programa de captura en la plataforma externa, y saber si esto está pasando es muy difícil. Sugiero pensar más en formas de ritmo de representación especial o entrelazado, contrastes especiales, etc.

También puede ejecutar sus salidas a la pantalla como si fuera una película, codificarla con un codificador de baja velocidad y resolución, de modo que una captura aún cada 100 ms será de una calidad tan baja que no tendría ningún valor. (¿Alguna vez ha congelado una película de baja calidad?)

Sin embargo, realmente debería considerar el uso de otras formas de proteger su información.

7

Esto nunca va a funcionar. No solo eso, sino que los intentos de brindar este nivel de seguridad van a ser un inconveniente para el 99% de sus usuarios legítimos.

Quizás sea mejor abordar el problema desde el ángulo de intentar identificar usos/copias no deseados de su información y acercarse a las personas/empresas que utilizan esa información.

La ley de derechos de autor es apropiada para este enfoque, pero entiendo que hay algunas aplicaciones en las que este enfoque no está disponible.

3

En primer lugar, los comentarios sobre el uso de una máquina virtual son completamente inútiles: es mucho más fácil detectar ventanas que se ejecutan bajo un virtualizador que detectar una captura de pantalla.

Una buena forma de hacer que las capturas de pantalla sean difíciles sería reescribir el programa para que se ejecute en modo de pantalla completa con un extensor de dos ancestrales.

Una buena forma de prohibir el 95% de los usuarios que alguna vez intentaron tomar una captura de pantalla es mostrar una gran pancarta intermitente en el inicio ("¡se prohíben las capturas de pantalla! ¡Prohibido!") Y detectar al usuario presionando PrtScrn durante los siguientes 15 segundos.

+0

Hah at el último párrafo =). – Claudiu

+0

Me pregunto por qué esto tiene tan pocos upvotes ... –

+0

"mucho más fácil detectar ventanas que se ejecutan en un dispositivo de virtualización" - sí, por lo que estoy pasando la copia legítimamente licencia de WinXP en una máquina virtual en Linux; Y tu punto es...? – Piskvor

2

Otra razón por la que creo que será imposible de lograr esto:

Hace mucho tiempo, no he logrado hacer una captura de pantalla del contenido de Windows Media Player, porque (Asumí) WMP transmite ese contenido a la tarjeta de video de inmediato. (Detalle divertido: después de pegar la captura de pantalla, el video continuaría reproduciéndose en MS Paint, pero al guardar la imagen se obtendría un cuadrado negro). De todos modos, usar VNC hizo que fuera muy fácil obtener la captura de pantalla después de todo.

+0

Lo mismo me sucedió a mí también. Siempre me pregunté por qué. – Claudiu

+3

No creo que Media Player lo haga para evitar capturas de pantalla, es un efecto secundario. Cualquier superposición como esa no se puede capturar normalmente. Sin embargo, si desactiva la aceleración de hardware, no usará la superposición y podrá tomar una captura de pantalla de la misma. –

+0

De hecho, también creo que es un efecto secundario. (Aunque a Microsoft le gustaría detener la grabación de pantalla para contenido protegido con DRM.) – Arjan

4

Puede (no fiable) hacer esto mediante el uso de SetWindowsHookEx.

Here is a complete VB.NET example.

Sin embargo, hay muchas maneras de evitar esto. Un gancho instalado después del suyo "anulará" su gancho. Los usuarios pueden tomar fotos de su pantalla de muchas maneras, como se describe en este hilo. Trataría de considerar otras opciones de protección más allá de esto.

-1

hay una forma en que creo que podría detenerlo. aprenda sobre la tecnología que desenfoca una pantalla gráfica cuando se duplica, por ejemplo.

captura de pantalla, fotografiada por la cámara digital captura de pantalla de virtual os.

juego con él, que sabe que podría inventar algo que va a hacer u millones.

+0

"desenfoca una pantalla gráfica cuando está duplicada" - eso es ciencia ficción, no tecnología real. Los bits que se convierten en la imagen de visualización se duplican y se modifican mucho antes de que salgan del programa a través del SO al hardware. El verdadero problema aquí es descifrar la intención, lo cual es bastante difícil con los humanos, y mucho menos con las instrucciones de la computadora. – Piskvor

Cuestiones relacionadas