Определить, когда пользователи делают скриншоты моей программы - PullRequest
6 голосов
/ 22 апреля 2009

Я пишу приложение для Windows. Как я могу узнать, когда снимается скриншот? Я читал о том, как обнаружить нажатие горячей клавиши, но меня больше беспокоит случай, когда каждые 100 мс или около того другая программа делает снимки экрана. А именно, я пытаюсь заметить, когда кто-то создает другую программу (скажем, Python, использующую ImageGrab, как упомянуто в другом посте), которая постоянно делает снимки экрана моего приложения и использует их для считывания информации из него.

Меня не волнует, что снимать скриншоты - я могу просто забанить пользователя, как только это будет замечено.

Возможно ли это? Есть ли сообщение Windows, отправленное, когда какое-либо приложение делает снимок экрана, как с WM_HOTKEY? Или Windows просто использует последнюю информацию из последних событий рисования и возвращает ее непосредственно другой программе, при этом мое приложение вообще не может это заметить?

Ответы [ 10 ]

28 голосов
/ 22 апреля 2009

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

7 голосов
/ 22 апреля 2009

Это никогда не сработает. Не только это, но и попытки обеспечить такой уровень безопасности причинят неудобства 99% ваших законных пользователей.

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

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

7 голосов
/ 22 апреля 2009

Что если я использую видеокамеру? Что делать, если я записываю видео между компьютером и монитором?

Я буду удивлен, узнав, что есть практический способ сделать это.

4 голосов
/ 22 апреля 2009

Вы можете (ненадежно) сделать это, используя SetWindowsHookEx .

Вот полный пример VB.NET.

Однако есть много способов обойти это. Крюк, установленный после вашего, «переопределит» ваш крючок. Пользователи могут делать снимки своего экрана разными способами, как описано в этой теме. Я бы попробовал рассмотреть другие варианты защиты, кроме этой.

3 голосов
/ 22 апреля 2009

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

Хороший способ сделать скриншоты сложным - переписать вашу программу для работы в полноэкранном режиме под некоторым наследственным экстендером.

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

2 голосов
/ 22 апреля 2009

Еще одна причина, по которой, я думаю, достичь этого будет невозможно:

Давным-давно мне не удалось сделать снимок экрана с содержимым проигрывателя Windows Media, потому что (я предположил) WMP сразу же передал этот контент на видеокарту. (Забавная деталь: после вставки снимка экрана видео продолжит воспроизводиться в MS Paint, но сохранение изображения в конечном итоге приведет к черному квадрату). В любом случае, с помощью VNC стало очень просто получить снимок экрана.

2 голосов
/ 22 апреля 2009

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

1 голос
/ 22 апреля 2009

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

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

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

1 голос
/ 22 апреля 2009

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

0 голосов
/ 06 июня 2009

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

скриншот, сфотографирован цифровой камерой скриншот из виртуальной ОС.

поиграйте с этим, кто знает, что вы можете изобрести что-то, что принесет вам миллионы.

...