Во время работы на компьютере часто встречаются ситуации, когда надо сохранить копию экрана в графический файл. Например, чтобы проиллюстрировать картинкой некий текст, отправляемый вместе с письмом в службу технической поддержки с уведомлением о неправильно работающей программе. Бывает, картинка необходима для реферата, отчета или еще для чего-то.
Стандартно задача снятия копии экрана решается нажатием клавиши Print Screen (PrtSc), копирующей содержимое экрана в буфер обмена операционной системы Windows. Затем картинку следует извлечь из буфера (например, нажатием стандартной комбинации клавиш Ctrl + V) в каком-либо графическом редакторе, при необходимости обработать изображение и сохранить его в окончательном виде в выбранном графическом формате (bmp, jpg, jpe, tif и др.) с требуемой степенью сжатия.
Но не всегда дело обстоит так просто! Порой требуется использовать специальные программы копирования экрана, называемые скриншотерами, или, более понятно, хотя и менее благозвучно - экранограбилками. Назову только две ситуации, когда возникает необходимость в использовании таких программ. Вариант первый. Что такое электронная книга, объяснять не надо. Относительный недостаток электронных книг в том, что читать текст с экрана компьютера менее удобно, чем с бумажного листа. Несомненное достоинство электронных книг в том, что один раз сверстанная книга может распространяться в неограниченном количестве экземпляров без дополнительных расходов на печать книги, в отличие от бумажных тиражей. Это несомненное достоинство оборачивается огромным недостатком, когда электронные книги начинают бесконтрольно распространяться по сети Интернет. Зачем покупать электронную книгу, когда ее можно просто скачать с какого-либо сервера Сети?!
Для борьбы с этим бедствием издатели электронных книг используют разные защиты, противодействующие свободному распространению электронных книг. Электронная книга, привязанная к "железу" конкретного компьютера, не запустится на другом, но что мешает покупателю книги, запустив файл, сделать нужное количество копий экрана с наиболее интересными страницами книги или отсканировать всю книгу целиком? По большому счету, ничего, хотя разработчики защиты могут заблокировать стандартный буфер обмена операционной системы. Однако все, что выводится на экран компьютера, как вы увидите далее, может быть скопировано тем или иным способом. Вариант второй: требуется получить серию экранных снимков в настолько короткий промежуток времени, что выполнить стандартную последовательность действий (клавиша "Print Screen" и т. п., см. выше) просто не успеть. Быстро жать несколько раз на клавишу копирования смысла нет, так как в буфере обмена может сохраниться только одна копия экрана.
В такой ситуации необходима программа, автоматически копирующая содержимое экрана в файлы через заданный промежуток времени, или модифицирующая стандартный буфер обмена так, чтобы в нем можно было хранить несколько изображений и существовал механизм извлечения требуемой картинки из ряда изображений, записанных в буфер. В качестве примера программы такого типа приведу ClipMate (http://www.pcdigest.net/dir/detailed/4658.shtml) - утилиту копирования и вклеивания нескольких фрагментов в буфер обмена Windows. ClipMate работает параллельно со стандартным буфером, позволяя запоминать, редактировать, просматривать, распечатывать, экспортировать текстовые или графические фрагменты. Программа распространяется свободно. Что до первого варианта программы, то напишем сейчас его сами. Программа эта будет примечательна еще и тем, что совершенно спокойно скопирует содержимое экрана даже в том случае, если на него выводятся страницы защищенной книги.
Создана надежная защита от скриншотмейкеров!!!
Вот цитата из описания программы SecureBook Professional (http://www.securebook.ru/buy.php ), которая, по мнению многих известных киберсантов-манимейкеров, является лучшей на настоящий момент программой защиты электронных книг: "Защита от скриншотмейкеров. Над этой функцией пришлось поработать особо. Как известно, сделать скриншот экрана в Windows позволяет клавиша PrintScreen. Защититься от нее позволяет любой компилятор электронных книг, но многие наивно полагают, что эта защита чего-то стоит. Конечно, от неискушенного читателя она спасет, но от человека, целенаправленного на взлом книги, это давно не панацея. Существует множество специализированных утилит для сохранения экрана в файл. Есть даже такие, которые позволяют автоматизировать этот процесс, например, прокручивая окно с текстом вниз и делая скриншоты, а затем автоматически склеивая все в одну большую картинку (и возни не нужно, и ошибочное мнение, что чем длиннее страница, тем сложнее ее будет отснять, опровергнуто).
Кроме таких программ есть еще утилиты, записывающие видео с экрана, а также системы автоматического распознавания и представления в текстовом виде графической информации прямо с экрана. Так вот, кроме всего прочего SecureBook Professional призвана защищать и от такого "счастья". Описывать ее более подробно нет смысла - стоит один раз попробовать сделать это, и вы все поймете". Замечу, что я не ставил перед собой цель разобраться с тем, как удалять защиту из электронной книги! Не стану рассуждать и об алгоритмах шифрования и криптозащиты. Есть AES, есть много других интересных алгоритмов, таких как 3DES, GOST, SHA1, MD5 и прочие, но это тема отдельного разговора, так же как и тема привязки программы к компьютеру с учетом аппаратных особенностей последнего. Всего лишь подтверждаю конкретным примером очень простую мысль о том, что все выводимое на экран можно с большими или меньшими усилиями скопировать. Для этой цели можно воспользоваться, например, моей бесплатной утилитой (доступной по адресуhttp://aiv.spb.ru/ufiles/aivscreen.zip), которая позволяет копировать содержимое экрана (в том числе и с защищенными страницами), а затем оформить подборку картинок в удобную HTML-подборку. Утилита построена с использованием тех процедур копирования изображения, которые мы и рассмотрим дальше.
Пишем программу копирования экрана
А сейчас сами напишем программу (используя среду визуального программирования Delphi), позволяющую копировать содержимое экрана через определенный промежуток времени в файл. Правда, в небольшой статье я не смогу подробно рассказать обо всех тонкостях программирования и дать подробный анализ каждой строчки программного кода.
Для современных программистов задача разработки больших и сложных программ значительно упростилась тем, что в сети Интернет опубликовано множество исходных текстов самых разных программ, и взятые из них процедуры и функции можно использовать в качестве строительных кирпичиков будущей программы. При этом нет нужды в специальных знаниях о том, как сделан тот или иной "кирпичик", -обычно хватает первоначальных навыков по правильной укладке и монтажу в единое целое отобранных блоков.
В качестве таких блоков используем GetSystemPalette и CaptureScreenRect. Программные коды функций опубликованы на многих сайтах Сети (например, на http://program.vulcan.ru/articles/d2.htm). Для начала конкретизируем, что должна делать разрабатываемая версия. Постановка задачи такова: будучи запущенной, программа делает серию снимков экрана через определенный промежуток времени (для определенности возьмем 5000 мс), сохраняя экранные копии в файлы с именами 1.bmp, 2.bmp, ... 20.bmp. Таким образом, размер серии - 20 файлов, а сами файлы будут созданы в той же папке, где находится исполняемый файл программы. После завершения серии снимков программа выдает сообщение "Копирование экрана (серия из 20 снимков) ВЫПОЛНЕНО".
Разработку программы начинаем с того, что запускаем Dilphi и на поверхность формы помещаем невизуальный компонент таймер (Timer1). Значение поле Enabled - true, Interval - 5000. Первое значение показывает, что при старте программы компонент активен и начинает отсчет времени, второе поле содержит информацию о том, через сколько миллисекунд произойдет событие, которое будет обработано процедурой TForm1.Timer1Timer. После того как функция вызвана, таймер начинает новый отсчет и, по прошествии времени, заданного в поле Interval, снова вызывает данную процедуру. Поскольку мы делаем серию из 20 снимков, процедуру TForm1.Timer1Timer необходимо вызвать 20 раз, а затем остановить работу таймера. При каждом вызове процедуры увеличиваем значение переменной i на единицу и проверяем это значение. Как только значение i станет равным 21, выполняем блок, содержащий код form1.Visible:=true; timer1.Enabled:=false; Form1.Caption:=Копирование экрана (серия из 20 снимков) ВЫПОЛНЕНО'. Таймер остановлен, пользователь видит сообщение о том, что снятие копий экрана закончено. За копирование экрана отвечает функция CaptureScreenRect(Rect (0,0,Screen.Width,Screen.Height)) .SaveToFile (inttostr(i)+ ".bmp"). Информация сохраняется в файл, имя которого - строковая переменная, получаемая в результате конкатенации (сложения) строк inttostr(i) и ".bmp". Поскольку переменная i содержит число, для преобразования его в строку используем функцию inttostr.
Прямой доступ к устройствам, который использовался в ОС DOS, запрещен в ОС Windows, а вместо непосредственного взаимодействия с аппаратной частью предназначен программный интерфейс, представляемый операционной системой в виде набора системных API-функций. Для того чтобы идентифицировать графическое устройство, введено понятие графического контекста (DC, Device Context - Контекст устройства), представляющего собой описание параметров графического устройства и используемого по ссылке (HDC, Handle DC - Ссылка на контекст устройства). Процедура GetMem (var P: Pointer; Size: Integer) создает динамическую переменную: выделяет блок памяти размером Size байт под переменную, указанную в параметре P, и возвращает указатель на начало данного блока памяти. Параметр P может представлять собой любой тип указателя. Указатель на новую созданную переменную записывается как P^. Как я уже отметил ранее, для написания программы удобно использовать готовые процедуры и функции, если такие есть. Тем более, что разобраться в том, как работает готовая профессионально написанная процедура или функция, значительно легче, чем выполнить полную разработку с нуля. Информацию с описанием стандартных процедур и функций Delphi можно найти в справочной системе (хелпе) данного продукта, но, учитывая, что не все читатели свободно владеют английским языком, приведу ссылку на сайт с русскоязычным описанием наиболее часто используемых функций и процедур (http://www.helloworld.ru/texts/comp/lang/delphi/delphi5/content.htm).
Итак, текст программы:
Архив с файлами проекта данной программы доступен по ссылке http://aiv.spb.ru/ufiles/mini.zip. При желании можно посмотреть программу в работе и усовершенствовать исходный текст в соответствии со своими вкусами.