Как предотвратить печать экрана
У меня есть требование, чтобы приложение, над которым я работаю, не позволяло пользователю легко захватывать содержимое экрана.
Я сообщил, что невозможно полностью предотвратить это, но я ищу методы, чтобы ввести некоторые препятствия для процесса.
Я использую С#/.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). Я подозреваю, что вам нужно будет это сделать.
Ответ 5
Возможно, эта статья может быть полезной:
Отключение экрана печати, вызов производных деструкторов и многое другое
Ответ 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();