#c# #windows #screenshot #takesscreenshot
Вопрос:
Я создаю программу Winforms для друга, и одна из функций, которую он хочет реализовать, состоит в том, чтобы скрыть содержимое текстового поля от записи; это означает, что он хочет, чтобы оно было защищено от скриншотов и записей экрана.
В этот момент я попытался объяснить тщетность этого, объяснив, что
- Существует множество программ, которые можно использовать для записи/захвата экрана, и попытка просмотреть их все была бы не только слишком исчерпывающей, чтобы объяснить, но и бессмысленной, поскольку любой программист, достойный своего дела, может создать персональную программу, которая может сделать снимок экрана без использования каких-либо известных имен
- Даже если вам каким-то образом удастся заблокировать все программы, человек может просто сфотографировать экран
Чтобы ответить на вопрос о том, чтобы сфотографировать экран, он сказал, что, хотя мы не можем сделать программу совершенной, мы МОЖЕМ сделать так, чтобы кому-то было как можно труднее «взломать» ее. (Личное мнение таково, что он в некотором роде прав, но я не думаю, что мы должны переусердствовать в чем-то с таким простым обходом)
Однако его ответ на вопрос о существовании множества различных программ записи был довольно интересным, но я знаю недостаточно, чтобы дать ему ответ с уверенностью. Он предположил, что во всех программах ДОЛЖНО быть какое-то общее действие, поскольку в какой-то степени все они захватывают копию данных, отображаемых на экране, для использования, и что теоретически мы должны быть в состоянии обнаружить это действие и отреагировать соответствующим образом.
Итак, мой вопрос таков: знает ли кто-нибудь, существует ли общее действие для программ, которые записывают экран, и если есть общее действие, то что это такое?
Ответ №1:
Все программы захвата экрана работают одинаково в том смысле, что они взаимодействуют с графическим движком для захвата изображения экрана в определенный момент времени, но это все, что происходит, при выполнении захвата экрана не происходит триггера события, и поэтому нет способа определить, когда происходит захват.
Изменить: Программа захвата экрана получает доступ к экрану по телефону GetDC(NULL)
. Затем он копирует содержимое в растровое изображение с помощью функции BitBit. При вызове не происходит никакого события GetDC()
, возможно, в Windows встроен метод, который не был задокументирован Microsoft и скрыт глубоко в API Windows, но в настоящее время ничего не задокументировано.
Для получения дополнительной информации об этом взгляните на Windows Confidential: То, что вы видите, — это то, что вы получаете
Комментарии:
1. и слишком много программ взаимодействуют с графическим движком, чтобы что-то, имеющее к нему доступ, можно было пометить? Или взаимодействие с графическим движком не вызывает никаких событий?
2. Взаимодействие вообще не вызывает никаких известных событий.
3. Но если есть конкретный, который я бы искал, смог бы я его обнаружить, если бы знал, что слушать? (например, как чат snap обнаруживает снимки экрана?)
4. Если бы вы точно знали, какие программы захвата экрана вы хотите отслеживать, и знали, как называется их служба, то теоретически вы могли бы написать программу для отслеживания запущенных служб, и когда они появятся, вы могли бы запустить событие, с которым вы могли бы работать, но этот метод был бы бесполезен при обнаружении нажатия клавиши печати на клавиатуре. Snapchat управляет защитой от снимков экрана только потому, что попытка сделать снимок экрана на устройствах iOS прерывает прикосновения к экрану, поэтому вам нужно постоянно прикасаться к экрану, чтобы SnapChat работал, в Windows нет такой функции или обходного пути.
5.
GetDC(NULL)
это действительно неверное решение. Бит, отбрасываемый с него, отбрасывается с основной поверхности GDI, а НЕ с самого буфера кадров. Вы ДОЛЖНЫ подключиться к DWM, чтобы получить правильное изображение рабочего стола. Есть некоторые приложения, которые не используют GetDC(NULL), и одно из них-Лупа. И большинство игр. Запустите лупу, установите ее в режим просмотра объектива, нажмите «Экран печати» и обратите внимание, что у вас появляется черное окно. Попробуйте распечатать экран в любой игре в эксклюзивном режиме.
Ответ №2:
В случае захвата экрана, если мы отслеживаем буфер обмена и обнаруживаем запущенное приложение на переднем плане, мы можем распознать активность. В случае инструмента обрезки, если сделать снимок экрана, он попадет в буфер обмена, и мы сможем вставить его напрямую.
Комментарии:
1. это действительно хороший ответ, и мне жаль, что я не подумал об этом раньше, но вы возрождаете давно умерший пост
2. Существует нулевая корреляция между захватом экрана и размещением данных в буфере обмена. Буквально ни одного. Это ни в малейшей степени не полезно.
Ответ №3:
Поддерживаемый способ предотвратить отображение содержимого окна на снимке экрана-пометить соответствующее окно, чтобы ОС могла его удалить.
Это делается с помощью вызова API SetWindowDisplayAffinity, введенного в Windows 7. Передача WDA_MONITOR
флага позволит отображать окно на мониторе. Окно появится без содержимого везде (например, при захвате экрана).