Напомню, что защита электронных книг строится на запрете копирования текста оттуда и запрете снимков экрана клавишей PrintScreen (в предыдущей статье я рекомендовал очищать буфер обмена после попадания в него текста или картинки).
Но HiAsm предоставляет нам компонент для снимков экрана безх использования клавиши PrintScreen и буфера обмена! Вот такой замечательный HiAsm! И нужный нам компонент ScreenShort находится на вкладке "Окно" панели компонентов. У него всего три точки. Метод нужно вызвать для снимка, на событие выдаётся картинка, а точка данных принимает идентификатор окна, которое нужно снять.
Идентификатор окна - это число, которое любое окно и визуальный компонент Windows получает при запуске. Оно выбирается произвольно, но один и тот же идентификатор для разных окон быть не может, он всегда уникален. Идентификатор визуальных компонентов HiAsm можно считать с точки нижней Handle. Для получения идентификаторов чужих окон производится поиск окон компонентом WinEnum со вкладки "Окна", этот компонент выдаёт загловки окон и их идентификаторы.
Ещё нам нужно решить, какое событие приведёт к снимку. Нажатие кнопки использовать нельзя, ведь форма должна быть свёрнуа на панель задач, чтобы не загораживать окно снимаемой программы. Как вариант - нажатие кнопки в Windows.
Для отлавливания нажатия клавиш не на форме испльзуется компонент KeyHook. Ему требуется библиотека Hook.dll, которая находится в папке Plug рядом с HiAsm. Её рекомендуется класть рядом с программой. Компонент выдаёт код клавиши, а Case его проверяет на равенство 13 (это код клавиши Enter) и при равенстве делает снимок. Так как идентификатор мы не указали, то снимается весь экран. Рисунок сохраняется на диске C:.
Если нужно снять не весь экран, а только часть - окно книги, например, то нужно сначала найти это окно и передать его идентификатор компоненту ScreenShort. Поиск окон производится компонентом WinEnum с той же вкладки.
Здесь используются два списка: видимый - для заголовков окон, невидимый - для идентификаторов, причём, как видно из кода, положение заголовков и идентификаторов соответствует друг другу, так что при выборе заголовка окна можно брать из невидимого списка его идентификатор под тем же номером строки, что и заголовок. А затем используется компонент Memory. В остальном снимок делается так же.
Ну и напоследок покажу, как сделать скриншот активного окна, то есть того, которое отображается поверх всех и имеет синюю (а не серую) строку заголовка.
Как видите, это очень просто, потому что у KeyHook есть точка свойств, с которой можно считать идентификатор активного окна.
В ХР программа срабатывает - жмешь кнопку "Искать", выбираешь в списке нужное окно и потом жмешь Enter. Но только в снимок окна попадает и окно рабочей формы. Как этого избежать?
ОтветитьУдалитьВ Висте ничего не работает... ;0(
Свернуть окно. Скриншот - это снимок прямоугольника окна, и если что-то есть постороннее, то снимается и оно.
ОтветитьУдалитьа можно создать перехватчик клавиш чтобы он сохранял клавиши и расшифровывал
ОтветитьУдалитьРазумеется. Используйте компонент KeyHook со вкладки "Разное".
ОтветитьУдалитьесли будет время напишите мне pnv99game@gmail.com
ОтветитьУдалитьи объясните как расшифровывать
и сохранять что перехватило
._. Я ничего не понял..
ОтветитьУдалить