воскресенье, 11 октября 2009 г.

Буфер обмена

Если вы читали когда-нибудь защищённую электронную книгу, то знаете, что при попытке скопировать из неё текст она запрещает это делать, и не получается даже сделать снимок экрана кнопкой PrintScreen. Я покажу вам, как это можно реализовать в HiAsm.

Когда вы копируете картинку или текст, то это заносится в буфер обмена. HiAsm умеете работать с буфером обмена. Он может заносить в него текст/картинку и получать их. А также реагировать на изменения в буфере.

Прежде чем перейти к рассказу о защите от копирования текста в программе, я покажу, как вообще можно работать с буфером в HiAsm. На вкладке "Система" для этого есть компонент Clipboard (группа "Компоненты"). С его помощью можно заносить данные в буфер обмена и читать их из буфера обмена.

Скачать схему HiAsm

В этом примере буфер используется только для текста, но у компонента Clipboard есть и другие точки - для картинки.

Но этот компонент позволяет просматривать буфер обмена лишь по требованию, а не тогда, когда буфер обмена изменяется. На вкладке "Контролы" есть другой компонент - ClipboardHook. Его событие onChange происходит тогда, когда в буфер обмена попадает текст.

Скачать схему HiAsm

Как только вы скопируете текст из многострочного поля, так он сразу отобразится в однострочном. А есть ещё событие onBitmap - происходит, когда в буфер попадает картинка. Вот на этом и будет строиться наша защита от копирования текста из программы.

Скачать схему HiAsm

Как только вы скопируете текст или картинку, разветвитель в программе сразу задействует пустой DoData и занесёт данные из него в буфер обмена как текст. И буфер обмена будет пуст.

Недостаток этого метода в том, что копировать нельзя будет не только из этой программы, но и вообще ниоткуда. Однако защита электронных книг вряд ли лучше. Скорее всего, такие книги просто отлавливают нажатие PrintScreen (но отловить эту клавишу компонентом HiAsm для отлавливания клавиш не получится), а потому их защиту можно обойти. А как - я расскажу в другой раз.

12 комментариев:

  1. А как отловить нажатие PrintScreen?

    ОтветитьУдалить
  2. Дааа... Короткое замыкание ClipboardHook из примера bh009.sha намертво блокирует буфер обмена - такая каверза, будучи добавленная в автозагрузку, вызовет панику у Ваших друзей (подруг) и позволит Вам выступить в роли ГУРУ-спасителя.
    Но стоит ли вообще защищаться от копирования? Как-то это выглядит мелко и несовременно. Или есть ситуации, когда это оправданно? Что на этот счет думает уважаемый Сергей Сергеев?

    ОтветитьУдалить
  3. В примере же написано, что можно защищать от копирования текста свою программу. Разумеется, область применения компонента не ограничивается защитой от копирования.

    ОтветитьУдалить
  4. У меня такой вопрос по поводу Буфера обмена. Сталкнулся с переполнение буфера. Не знаю как решить данную проблема. Я сделал программу которая копирует динамически изменяемый текст с помощью мыши и вставляет текст в редактор строк автоматом при копировании. Но когда проходит неопределённое колличество времени скопированный текст уже не вставляется хотя скопированный текст был именён. Можете построить какой пример урока либо решение данного вопроса

    ОтветитьУдалить
  5. Выложите схему (или её часть, где реализована работа с буфером) на какой-либо файлообменник и оставьте тут ссылку на него. Без схемы трудно понять, где именно неполадка.

    ОтветитьУдалить
  6. Подскажите как реализовать простую схему, с автоматическим сохранением картинки на рабочий стол, при нажатии кнопки "принт скрин"...смотрел урок, так не чего и получается.

    ОтветитьУдалить
  7. Спасибо!, пытаюсь понять зачем тут клонирование потока, если точка буфера уже обещает вывод картинки (по идеи имя только задать)...Думаю какие элементы нужны, чтобы файл не перезаписывался при повторном скрине, а сохранялся с другим именем.

    ОтветитьУдалить
  8. Если в Picture Stream есть в свойствах строка - file Name, то по чему, там нельзя сразу задать имя "рисунок.bmp" и вывести на рабочий стол?...
    И где найти урок, чтоб объяснили, что значит цвет точек и линий...
    P.S.
    Заранее благодарен.

    ОтветитьУдалить
  9. "Если в Picture Stream есть в свойствах строка - file Name, то по чему, там нельзя сразу задать имя "рисунок.bmp" и вывести на рабочий стол?..."
    Имя-то задать можно, но путь заранее неизвестен, так как для разных пользователей разный путь к рабочему столу. Поэтому сначала компонентом Dir получаем путь к рабочему столу текущего пользователя, а потом уже соединяем его с именем файла.

    Чтобы файл не перезаписывался, можно добавлять к имени дату записи, например так.

    Цвет точек обозначает тип передаваемых по ним данных. Например, для передачи точки для передачи строк серые, чисел - жёлтые. Но это только верхние и нижние точки, а правые и левые точки всегда зелёные, потому что они более универсальны в плане типов данных. Цвета линий показывают, какие точки связывают линии: верхнюю/нижнюю или правую/левую.

    Настроить цвет точек (и линий) можно задать в настройких (Сервис - Настройка - Редактор в HiAsm 4.02 build 179).

    ОтветитьУдалить
  10. "Если в Picture Stream есть в свойствах строка - file Name, то по чему, там нельзя сразу задать имя "рисунок.bmp" и вывести на рабочий стол?..."

    А PrintScreen захватывает экран в формате BMP? А если нужен JPG, то конвертацию ставить надо?

    ОтветитьУдалить
  11. В Picture Stream нет такой строки в свойствах. По крайней мере, в моей версии HiAsm. Но если у вас есть - можно и так.

    Да, после PrintScreen в буфере оказывается картинка bmp. Её следует переконвертировать в jpg, если нужен этот формат.

    ОтветитьУдалить