Как предотвратить печать экрана

У меня есть требование, чтобы приложение, над которым я работаю, не позволяло пользователю легко захватывать содержимое экрана.

Я сообщил, что невозможно полностью предотвратить это, но я ищу методы, чтобы ввести некоторые препятствия для процесса.

Я использую С#/.NET 2.0 и WinForms

Ответ 1

Вы не можете.

Лучшее, что вы можете сделать, это визуализировать аппаратное ускоренное устройство на оверлее, похожее на то, что делали видеоплееры. В принципе, вы рисуете все свое синее окно и визуализируете свою графику на видеокарте, и внутренне видеокарта заменит синий графикой. Недостатком этого является то, что вы должны отказаться от использования элементов управления winforms, и я не знаю, как легко это сделать с .NET. Я думаю, что если вы используете DirectShow.NET, один из их образцов помещает вашу собственную графику в поток.

Даже после выполнения всего этого, все еще можно получить скриншот. Просто сделайте снимок экрана с помощью цифровой камеры.

Ответ 2

От здесь:

а. Windows реализует экран печати с помощью зарегистрированной горячей клавиши. Windows использует предопределенные горячие клавиши IDHOT_SNAPDESKTOP и IDHOT_SNAPWINDOW для обрабатывать экран печати. Они соответствуют экрану печати, который фиксирует весь экран и Alt + Print Screen, который отображает только активное окно. Чтобы отключить эти функции, все, что вам нужно сделать, это зарегистрируйте горячие клавиши, что заставляет Windows отправлять ваше приложение Сообщение WM_HOTKEY, когда пользователь нажимает горячую клавишу. Ваш реализация может игнорировать сообщение для обхода значения по умолчанию поведение захвата экрана. Хорошее место для этого - в вашем мэйнфрейме класс.

Ответ 3

Здесь у вас будет два случая, о которых вам нужно беспокоиться. Во-первых, когда ваше окно/приложение имеет фокус, другое, когда оно не имеет фокуса.

Когда у него нет фокуса, вы не можете многое сделать, например, если пользователь отключится от вашего приложения и на рабочем столе, ключи не будут отправлены в ваше приложение, чтобы вы их никогда не увидели. В этом случае вы можете свести к минимуму лоток, когда ваше приложение теряет фокус (или, возможно, поместите "пустую" панель поверх формы, чтобы пользователи не могли видеть что-либо на ней, что также предотвратит использование экрана печати).

В другом случае, когда у вас есть фокус, захватывайте нажатия клавиш и исследуйте их. Если клавиша Alt нажата, а кнопка PrintScreen опущена, reset значение, чтобы экран печати не появлялся. (Подумайте об этом, это может не сработать. Мне нужно проверить его, чтобы быть уверенным.)

Ответ 4

Вы можете посмотреть, что делают игроки фильма. Я считаю, что они непосредственно отображаются на аппаратной поверхности (через DirectX). Я подозреваю, что вам нужно будет это сделать.

Ответ 6

FWIW, это возможно. Вот код:

Это будет созданная dll, а затем вызовите метод HookKeyboard из вашего приложения. Я тестировал его, и он работает. Конечно, если кто-то делает снимок с помощью камеры, это не поможет, но, сделайте точку. 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));
            }
        }
    }
}

Ответ 7

Это на самом деле не отвечает на вопросы, но имейте в виду, что существуют инструменты для захвата экрана и что простая камера ломает все.

Я имею в виду, что вы "должны", но я бы (но я молод и все еще ученик, поэтому я не знаю много о том, что можно сказать) ответьте, что это просто глупо.

Ответ 8

Ознакомьтесь с новой технологией - sivizion.com, они не позволяют экрану печати одновременно - никоим образом не обойти его. Если кто-нибудь найдет способ взломать его, напишите здесь, я не мог. Я думаю, что они также лицензируют свои технологии, не уверен, проверьте это.

Ответ 9

Вы можете попробовать использовать IpcProtectWindow в msipc.dll.

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

Загрузите SDK из Microsoft

Вызвать функцию выше и предоставить дескриптор формы, которую вы хотели бы защитить. (Свойство Form.Handle)

Ответ 10

Ну, вы можете попробовать захватить кнопку, но я не уверен, насколько хорошо это сработает.

Одна вещь, которая всегда меня раздражала, заключалась в том, что всякий раз, когда я играл в кино, он никогда не снимал скриншоты. Если вы можете визуализировать через отдельный контекст, это будет очень раздражать, чтобы сфотографировать его. Возможно, вы можете отправить свой экран через что-то подобное?

Ответ 11

Есть приложения, которые могут захватывать экран из OpenGL и приложений DirectX! (в зависимости (они используются для записи игровых фильмов) пс. windows aero - DirectX

http://www.fraps.com/ Я думаю, что приложение

Ответ 12

Вы можете сделать любой случайный экран печати бесполезным с помощью Visual Cryptography и воспользоваться сохранением сетчатки (подробнее см. статью и bit.ly/vcrypto для веб-демонстрации).

Идея состоит в том, чтобы чередовать на высокой частоте между двумя или более случайными шумовыми изображениями, которые будут сочетаться посредством сохранения видения, чтобы выявить контент. Захват экрана будет захватывать только одно изображение с бессмысленным случайным шумом.

Это происходит за счет мерцания и вызывания головных болей пользователя, может быть побеждено камерой, снимающей изображение с экрана, или менее случайным пользователем, который знает фотошоп, но победит любой случайный захват экрана или захват кадра.

Иногда может быть полезно, в академическом смысле этого слова!

Ответ 13

Я решил его с помощью объекта Timer и Clipboard.Clear().

Сначала добавьте Timer в свою основную форму с помощью Interval=1 (очень быстро), а затем добавьте следующий код в свое событие:

Clipboard.Clear();