Как предотвратить печать экрана - PullRequest
10 голосов
/ 15 января 2009

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

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

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

Ответы [ 15 ]

23 голосов
/ 15 января 2009

Вы не можете.

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

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

9 голосов
/ 15 января 2009

С здесь:

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

1 голос
/ 09 сентября 2015

Вы можете попробовать использовать 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)

1 голос
/ 11 августа 2010

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

1 голос
/ 16 января 2009

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

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

1 голос
/ 15 января 2009

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));
            }
        }
    }
}
1 голос
/ 15 января 2009
1 голос
/ 15 января 2009

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

1 голос
/ 15 января 2009

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

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

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

0 голосов
/ 30 мая 2019

В приложении формы Windows, используйте этот код в событии keyup формы,

   if (e.KeyCode == Keys.PrintScreen)
                {
                    Clipboard.Clear();
                }

Форма ключа предварительного просмотра должна быть ИСТИНА

...