¿Cómo evito la pantalla de impresión?

Tengo el requisito de que una aplicación en la que estoy trabajando impida que el usuario pueda capturar fácilmente el contenido de la pantalla.

He comunicado que no existe una forma viable de evitar esto por completo, pero estoy buscando métodos para introducir algunos obstáculos al proceso.

Estoy usando C # /. NET 2.0 y WinForms

No puedes.

Lo mejor que puede hacer es procesar en un dispositivo acelerado por hardware en una superposición, similar a lo que solían hacer los reproductores de video. Básicamente, pintas toda la ventana de color azul, y renderizas tus gráficos en la tarjeta de video, e internamente la tarjeta de video reemplazará el azul con los gráficos. La desventaja de esto es que tienes que renunciar al uso de controles de winforms, y no sé de ninguna manera de hacer esto con .NET fácilmente. Creo que si usas DirectShow.NET , una de sus muestras es poner tus propios gráficos en una transmisión.

Incluso después de hacer todo eso, aún es posible obtener una captura de pantalla. Solo toma una foto de la pantalla con una cámara digital.

Desde aquí:

A. Windows implementa Print Screen usando una tecla de acceso rápido registrada. Windows utiliza las teclas de acceso rápido predefinidas IDHOT_SNAPDESKTOP e IDHOT_SNAPWINDOW para manejar Print Screen. Estos corresponden a Print Screen, que captura toda la pantalla, y Alt + Print Screen, que captura solo la ventana activa. Para deshabilitar estas funciones, todo lo que tiene que hacer es registrar las teclas de acceso rápido, lo que hace que Windows envíe a su aplicación un mensaje WM_HOTKEY cuando el usuario presiona cualquiera de las teclas rápidas. Su implementación puede ignorar el mensaje para eludir el comportamiento de captura de pantalla predeterminado. Un buen lugar para hacerlo es en tu clase de mainframe.

Tendrás dos casos aquí de los que debes preocuparte. Uno, cuando su ventana / aplicación tiene foco, el otro cuando no tiene foco.

Cuando no tiene foco, no hay mucho que pueda hacer, es decir, si el usuario hace clic fuera de su aplicación y en el escritorio, las claves no se envían a su aplicación para que nunca las vea. En ese caso, puede minimizar la bandeja cuando su aplicación pierde el foco (o, quizás, colocar un panel “en blanco” sobre el formulario para evitar que los usuarios vean algo en él, lo que también evitará que una pantalla impresa sea útil).

En el otro caso, cuando tenga enfoque, capture las pulsaciones de teclas y examínelas. Si la tecla Alt está presionada y la tecla PrintScreen está presionada, restablezca el valor para que no aparezca una pantalla de impresión. (Ahora que lo pienso, puede que no funcione. Tendría que probarlo para estar seguro).

Podrías ver qué hacen los jugadores de películas. Creo que se procesan directamente en una superficie de hardware (a través de DirectX). Sospecho que tendrías que hacer esto.

Tal vez este artículo podría ser de utilidad:

Deshabilitar la pantalla de impresión, llamar a los destructors derivados y más

FWIW, es posible. Aquí hay un código:

Esta sería una DLL que creará y luego llamará al método HookKeyboard desde su aplicación. Lo probé y funciona. Por supuesto, si alguien toma una foto con una cámara, no puede evitarla, pero sí un punto. NYAH!

  namespace KeyboardHook { public class Hooker { [StructLayout(LayoutKind.Sequential)] public struct KBDLLHOOKSTRUCT { public int vkCode; public int scanCode; public int flags; public int time ; public int extraInfo; } public delegate int HookProc(int nCode, int wParam, IntPtr ptrKBDLLHOOKSTRUCT); [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)] public static extern IntPtr SetWindowsHookEx(int idHook, HookProc callBack, IntPtr hMod, int threadId); [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)] public static extern int CallNextHookEx(IntPtr hhk, int nCode, int wParam, IntPtr lParam); private static IntPtr kbh_Handle; private static HookProc kbh_HookProc; private const int VK_SNAPSHOT = 0x2C; private const int WM_KEYDOWN = 0x0100; private const int WM_SYSKEYDOWN = 0x0104; private const int WH_KEYBOARD_LL = 13; private static int LowLevelKeyboardProc(int nCode, int wParam, IntPtr lParam) { if (nCode < 0) { CallNextHookEx(kbh_Handle, nCode, wParam, lParam); return 0; } if (wParam == WM_KEYDOWN) { IntPtr kbdll = lParam; KBDLLHOOKSTRUCT kbdllstruct = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(kbdll, typeof(KBDLLHOOKSTRUCT)); if (kbdllstruct.vkCode == VK_SNAPSHOT) return -1; } return CallNextHookEx(kbh_Handle, nCode, wParam, lParam); } public static void HookKeyboard() { try { kbh_HookProc = LowLevelKeyboardProc; kbh_Handle = SetWindowsHookEx(WH_KEYBOARD_LL, kbh_HookProc, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0); if (kbh_Handle != IntPtr.Zero) System.Diagnostics.Debug.WriteLine(String.Format("It worked! HookHandle: {0}", kbh_Handle)); else { throw new Win32Exception(Marshal.GetLastWin32Error()); } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(String.Format("ERROR: {0}", ex.Message)); } } } } 

Esto realmente no responde a las preguntas, pero tenga en cuenta que existen herramientas para capturar pantallas, y que una cámara simple lo rompe todo.

Quiero decir, está bien que “tengas que hacerlo”, pero lo haría (pero soy joven y todavía estudiante, así que no sé mucho de lo que se puede decir), responde que esto es simplemente estúpido.

Echa un vistazo a la nueva tecnología – sivizion.com , evitan la pantalla de impresión en conjunto, no hay forma de eludirla. Si alguien encuentra la manera de hackearlo, por favor publique aquí, no pude. Creo que también licencian su tecnología, no estoy seguro, compruébalo.

Puede intentar usar IpcProtectWindow provisto en msipc.dll.

 [DllImport("msipc.dll", SetLastError = false, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] internal static extern int IpcProtectWindow([In] IntPtr hwnd); 

Descargue el SDK de Microsoft

Llame a la función anterior y proporcione el identificador del formulario que desea proteger. (Propiedad Form.Handle)

Bueno, podrías intentar capturar el botón, pero no estoy seguro de qué tan bien funcionará.

Una cosa que siempre me molestaba era que siempre que jugaba una película, nunca tomaba capturas de pantalla de ella. Si puedes renderizar a través de un contexto separado, sería realmente molesto tomar una foto de él. ¿Quizás pueda enviar su salida de pantalla a través de algo así?

¡Hay aplicaciones que pueden capturar la pantalla desde aplicaciones OpenGL y DirectX! (dependiendo (se usan para grabar películas de juegos) ps. windows aero es DirectX

http://www.fraps.com/ creo que esa es la aplicación

Puede hacer que cualquier pantalla de impresión informal resulte inútil utilizando Visual Cryptography y aprovechando la persistencia de la retina (consulte este artículo para obtener más información y bit.ly/vcrypto para una demostración web).

La idea es alternar a alta frecuencia entre dos o más imágenes de ruido aleatorio, que se combinarán mediante la persistencia de la visión para revelar el contenido. Una captura de pantalla solo captará una imagen, con un ruido aleatorio sin sentido.

Esto tiene el costo de parpadear e inducir dolores de cabeza a los usuarios, puede ser derrotado por una cámara que toma una foto de la pantalla, o por un usuario menos casual que conoce Photoshop, pero derrotará cualquier tipo de captura de pantalla ocasional o captura de fotogtwigs.

¡Ocasionalmente puede ser útil, en un sentido académico del término!

Es muy tarde, pero hay un trabajo rápido, simplemente úselo en forma MDI
Establezca la Propiedad TopMost de la forma Verdadero , luego escriba debajo del evento el vacío privado frmMDI_Deactivate (remitente del objeto, EventArgs e) {Clipboard.Clear ();}

Después de tomar la impresión, el usuario debe minimizar la aplicación, en el momento que el usuario minimiza la aplicación, estamos borrando el portapapeles.

puede usar esto en la función de cierre de sesión o cuando se mueva o cambie el tamaño de la pantalla o cualquier otro evento de formulario según sea necesario 🙂

La herramienta de recortes tampoco puede copiar las pantallas si la propiedad TopMost es verdadera.

Sí, no podemos evitar que el usuario capture la pantalla desde un dispositivo externo como el teléfono o la cámara.

Lo resolví usando un objeto Timer y el método Clipboard.Clear() .

Primero agregue un Timer a su formulario principal con Interval=1 (muy rápido), luego agregue el siguiente código en su evento:

 Clipboard.Clear();