Назначение буфера обмена клавиатуры принципы работы самостоятельная подготовка
На уроке 15 мы говорили о причине появления лишних стилей. И одна из причин появления лишних стилей – это неумение правильно пользоваться таким явлением, как буфер обмена и, в частности, такой возможностью, как специальная вставка из буфера обмена.
По окончании урока вы сможете:
- Рассказать, что такое буфер обмена
- Применить специальную вставку из буфера обмена
Буфер обмена – это часть памяти компьютера, в которой можно сохранить информацию, которую вы скопировали. По мере необходимости скопированную информацию можно извлекать из буфера обмена и вставлять в выбранное нами место.
1. Буфер обмена. Возможности буфера обмена
Скачайте документ тут. Откройте документ.
Скопированную информацию можно вставлять много раз.
Буфер обмена един для всех программ, установленных на компьютере. Вы можете скопированный текст вставить в графический редактор Visio или CorelDraw. Скопированная информация храниться в буфере обмена, до тех пор, пока вы не скопируете что-нибудь новое. Новое затирает старое.
Но у офисных программ есть замечательная особенность: сохранение в буфере обмена до 24 (!) фрагментов. Причём, не важно каких: размер, вид, объём – всё это не важно. Одно копирование – один фрагмент. Воспользуемся этой особенностью.
- Лента Главная → группа команд Буфер обмена → кнопка группы. Откроется окно Буфера обмена.
- Выберите команду Параметры → Установите галочки:
- Собирать данные без отображения буфера обмена Office
Данные в количестве до 24 фрагментов будут собираться в буфере обмена вне зависимости открыто окно Буфера обмена или нет. Если вы скопировали больше 24 раз, то информация, скопированная первой, исчезнет, и так по кругу.
Интересная особенность: если вы копируете информацию в другой неофисной программе (например, вы работаете в графическом редакторе), то эта информация в количестве до 24 фрагментов будут собираться в буфере обмена Office. Тогда как в программе, в которой вы работаете в настоящий момент, будет доступен только последний скопированный фрагмент.
Если бы вы знали, как часто меня выручала информация, собранная в буфере обмена Office!
- Показать значок буфера обмена Office на панели задач
Буфер обмена настраивается один раз. Если вы закроете окно Буфера обмена, то настройки сохраняться. Закрывается Буфер обмена повторным щелчком ЛМ по кнопке группы (Лента Главная → группа команд Буфер обмена → кнопка группы):Если вам необходимо вставить фрагмент, скопированный ранее, то откройте окно Буфера обмена (вы уже знаете, как это делается). Далее из списка скопированный фрагментов выберите нужный вам фрагмент и щёлкните на нём ЛМ – фрагмент вставиться из буфера обмена.
Обратите внимание: на выбранном вами фрагменте появляется кнопка выпадающего меню. Щёлкните ЛМ по кнопке выпадающего меню и вы увидите две команды на выбор: Вставить и Удалить. Командой Удалить вы удаляете этот фрагмент из буфера обмена:
Запомните! | Скопированная информация хранится в буфере обмена до тех пор, пока вы не перезагрузите или выключите компьютер. |
2. Буфер обмена. Специальная вставка
Очень часто нам бывает нужна операция «Скопировать из документа – вставить в новый документ». Даже очень часто. Но эта операция является причиной появления лишних стилей в документе (см. Урок 15. Лишние стили текста). Ведь вместе с текстом мы копируем символ конца абзаца, а именно он заключает в себе всю характеристику абзаца (Стиль абзаца).
Если нам нужно вставить один абзац, то можно, перетаскивая мышку, выделить текст без символа конца абзаца, скопировать и вставить в новый документ, что мы и делали на Уроке 15. А если нам нужно скопировать несколько абзацев? Ведь в этом случае мы поневоле копируем символы конца абзаца, а с ними тащим в наш новенький чистенький документ кучу ненужных нам стилей, в чём мы уже с вами убедились на прошлом уроке. В этом случае нас выручит специальная вставка буфера обмена.
Вы открыли Учебный файл_Специальная вставка?
- Выделите весь текст (см. Урок 2. Я предпочитаю тройной щелчок ЛМ по полосе выделения)
- Скопируйте весь текст любым известным вам способом (я предпочитаю сочетание клавиш Ctrl+C).
- Создайте новый документ (я уже не напоминаю, что режим «Непечатаемые символы» и рабочее окно Стили должны быть заданы всегда).
- Лента Главная → группа команд Буфер обмена → кнопка Вставить → чёрный треугольник выпадающего меню.
Раскроется меню Параметры вставки:
Пройдитесь курсором по четырём кнопкам в раскрывшемся окне параметры вставки.
Первая кнопка
В этом случае мы притащим в новый документ все стили текста, которые только есть в старом документе. Оно нам надо?
Вторая кнопка даёт такую картину:Третья кнопка даёт такую картину:
Как видите, есть риск получить в список стилей Встроенный стиль.
Четвёртая кнопка даёт такую картину:
- Новые стили в области задач Стили не появились,
- Автоматическая нумерация списков превратилась в обычный текст.
Выбирайте, какой кнопкой специальной вставки Буфера обмена вы будете пользоваться.
Я предпочитаю кнопку
На мой взгляд, она самая безопасная в смысле «недопущения» в новый документ ненужных мне стилей.
Назначение буфера обмена и некоторые тонкости в применении при работе.
Буфер обмена (Б.О) – это часть оперативной памяти предоставленной программным обеспечением для временного сохранения файлов и папок.
Другими словами это такое место, куда сохраняется то, что вами копируется или вырезается для того чтобы потом куда-то вставить или перенести например текст, медиа файлы или какие-то папки.
Скопированная информация храниться в буфере обмена до тех пор, пока не будет скопирован новый объект, который заменит предыдущий или пока не произойдет завершение работы ПК.
Существуют определенные программы предоставляющие возможность хранить в буфере обмена несколько объектов с правом выбора нужного при вставке.
А вот находящуюся информацию в буфере обмена можно вставлять сколько угодно раз, ограничений в этом нет!
В Microsoft Office уже предустановлен расширенный буфер обмена позволяющий хранить до 24 объектов! Как это работает, рассмотрим на примере Microsoft Word.
На главной странице редактора в левом углу панели быстрого доступа нажимаем на квадратик со стрелкой, откроется окно буфера, где будет видно, сколько элементов в данный момент скопировано из двадцати четырех возможных.
Далее идут две вкладки «Вставить все» и «Очистить все» первая позволяет вставить сразу все объекты вторая все удалить.
Вкладка «Параметры» производит пользовательские настройки состоящая из пяти пунктов, которые на мой взгляд, не очень то нужны за исключением если только последнего пункта и то не обязательно.
В общем здесь на ваше усмотрение потому как все просто и интуитивно понятно о предназначении каждого пункта.
Если нужно что-то отдельное вставить или удалить наводим курсор на нужный скопированный объект и кликаем по нему правой кнопкой мыши (в выпадающем списке из двух пунктов выбираем нужное действие).
Следует учесть (Б.О) Microsoft Office работает только тогда когда запущена программа при ее закрытие данные не сохраняются!
Еще один важный момент при копировании файлов может возникнуть вот такое диалоговое окно, что не означает об ошибке или невозможности данного действия просто в программе Office такой формат не поддерживается, а файл на самом деле скопирован и его спокойно можно вставить куда вам нужно.
Горячие клавиши для работы с (Б.О)
Ctrl+A – выделить всё
Ctrl+C – копировать в буфер
Ctrl+X – вырезать
Ctrl+V – вставить
Ctrl+Insert – копировать
Shift+Insert – вставить
(О сочетании горячих клавиш для копирования и вставки объектов и других возможностей клавиатуры вы можете узнать в этой статье.)
Чистим буфер обмена
Сразу возникает вопрос для чего это нужно и зачем его чистить?
Для того чтобы не нарушать быстродействия системы компьютера!
Если скопировать фразу или отрывок текста это никак не повлияет на работу «ПК» но если файл весит несколько гигабайт, то нагрузка на операционную систему может быть весьма ощутима.
Поэтому всегда после тяжелого файла копируем любой маленький отрывок текста, или просто одно слово, зная о том, что предыдущий объект будет заменен последующим.
Вот, в общем, то и все что я хотел сказать по этой теме про буфер обмена на компьютере.
Работа с буфером клавиатуры в основном сводится к 2 операциям:
1. Очистка буфера.
2. Проверка символов в буфере.
Буфер устроен как циклическая очередь, которую называют также буфером FIFO (первый вошел - первый ушел). Как и любой буфер, он занимает непрерывную область адресов памяти. Однако не имеется определенной ячейки памяти, в которой находилось бы всегда начало строки в буфере. Вместо этого два указателя хранят позиции головы и хвоста строки символов, находящейся в буфере в текущий момент. Указатель головы указывает на позицию, занятую первым символом в буфере, а указатель хвоста - на позицию, следующую за последним символом (т.е. на первую свободную). Новые нажатия клавиш запасаются в позициях, следующих за хвостом (в старших адресах памяти) и соответственно обновляется указатель хвоста буфера. После того, как израсходовано все буферное пространство, новые символы продолжают вставляться, начиная с самого начала буферной области; поэтому возможны ситуации, когда голова строки в буфере имеет больший адрес, чем хвост. После того как буфер заполнен, новые вводимые символы игнорируются, при этом прерывание клавиатуры выдает гудок через динамик. В этот момент указатель хвоста указывает на ячейку перед головой в циклической очереди буфера (куда можно занести нажатие <Enter>). В то время как указатель на голову установлен на первый введенный символ, указатель на хвост установлен на позицию за последним введенным символом. Когда оба указателя равны, то буфер пуст. Поэтому чтобы очистить буфер клавиатуры, достаточно установить указатели на одно и тоже значение. Чтобы разрешить ввод 15 символов требуется 16-я пустая позиция, 2 байта которой всегда содержат код возврата каретки (ASCII 13) и скан-код клавиши <Enter>, равный 28. Эта пустая позиция непосредственно предшествует голове строки символов. 32 байта буфера начинаются с адреса 0040:001E. Указатели на голову и хвост расположены по адресам 0040:001A и 0040:001C, соответственно. Хотя под указатели отведено 2 байта, используется только младший байт. Значения указателей меняются от 30 до 60, что соответствует позициям в области данных BIOS. Для очистки буфера надо просто установить значение ячейки 0040:001A равным значению ячейки 0040:001C.
Проверка и установка статусов клавиш-переключателей
Два байта, расположенные в ячейках памяти 0040:0017 и 0040:0018 содержат биты, отражающие статус клавиши сдвига и других клавиш-переключателей следующим образом:
Байт | Бит | Клавиша | Значение, когда бит = 1 |
0040:0017 | Insert | Режим включен | |
CapsLock | Режим включен | ||
NumLock | Режим включен | ||
ScrollLock | Режим включен | ||
Alt | Клавиша нажата | ||
Ctrl | Клавиша нажата | ||
левый Shift | Клавиша нажата | ||
правый Shift | Клавиша нажата | ||
0040:0018 | Insert | Клавиша нажата | |
CapsLock | Клавиша нажата | ||
NumLock | Клавиша нажата | ||
ScrollLock | Клавиша нажата | ||
Ctrl-NumLock | Режим включен |
Остальные биты не используются.
Прерывание клавиатуры немедленно обновляет эти биты статуса, как только будет нажата одна из клавиш-переключателей, даже если не было считано ни одного символа из буфера клавиатуры.
Проверка и установка статуса клавиш-переключателей возможна с помощью использования механизма прерывания или непосредственно при работе с памятью.
Функция 2H прерывания 16H предоставляет доступ к одному, но только одному из байтов статуса. Это байт по адресу 0040:0017, который содержит больше полезной информации. Байт возвращается в AL.
;---проверка статуса клавиши вставки
MOV AH,2 ;номер функции
INT 16H ;получаем байт статуса
TEST AL,10000000B ;проверяем бит 7
JZ INSERT_OFF ;если 0, то INSERT выключен
В следующем примере устанавливается режим вставки, за счет установки бита 7 байта статуса по адресу 0040:0017 (который адресуется как 0000:0417).
SUB AX,AX ;устанавливаем добавочный сегмент на
MOV ES,AX ;начало памяти
MOV AL,10000000B ;готовим бит 7 к установке
OR ES:[417H],AL ;меняем байт статуса
Устройство, работа и организация памяти накопителей на магнитных дисках. Их основные технические характеристики. Работа с физическими и логическими секторами. Главная загрузочная запись (MBR), ее структура. Корректировка таблицы разделов. Основные служебные поля жесткого диска FAT32, с их структура, организация и использование.
Недавно у меня появилась возможность выполнить отладку буфера обмена в Windows, и я решил, что хорошо бы поделиться информацией, которую удалось узнать. Буфер обмена — это тот компонент Windows, который многие из нас используют десятки (сотни?) раз в день, особо не размышляя об этом. Прежде чем взяться за это дело, я даже никогда не задумывался, как всё устроено. Как выяснилось, там столько интересного, что вы даже не можете себе представить. Сначала опишу, как приложения хранят разные типы данных в буфере обмена и как извлекают их оттуда, а затем — как приложения могут «прицепиться» к буферу и отслеживать изменения в нём. В обоих случае вы увидите отладочные записи, которые показывают, как получить доступ к данным из отладчика.
Начнём с обсуждения форматов буфера обмена. Такие форматы используются для описания, какие типы данные можно поместить в буфер. Там есть некоторое количество предопределённых стандартных форматов, которые может использовать приложение, вроде битового массива, текста ANSI, текста в Юникоде и TIFF. Windows также позволяет приложению установить собственный формат. Например, текстовый процессор может зарегистрировать формат, включающий в себя текст, форматирование и картинки. Конечно, это ведёт к определённой проблеме: что произойдёт, если вы скопируете данные из текстового редактора и вставите их в «Блокнот», который не понимает всего этого форматирования и не отображает картинки?
Выход — разрешить одновременное хранение данных в буфере обмена в нескольких форматах. Когда я раньше думал о буфере обмена, то представлял, что там хранится единственный объект («мой текст» или «моя картинка»), но на самом деле мои данные хранятся в буфере в разных формах. Программа, которая берёт информацию из буфера, получает её в том формате, который она может использовать.
Как же данные появляются в буфере обмена? Очень просто, приложение сначала объявляет о праве собственности на буфер обмена через функцию OpenClipboard. После этого программа может очистить буфер обмена командой EmptyClipboard и, наконец, поместить туда свои данные командой SetClipboardData. SetClipboardData принимает два параметра. Первый — это идентификатор одного из форматов буфера обмена, которые мы упоминали выше. Второй — дескриптор сегмента в памяти, который содержит данные в этом формате. Приложение может неоднократно вызывать команду SetClipboardData для каждого из форматов, какие она хочет поместить в буфер, от лучшего к худшему (поскольку то приложение, куда будут вставляться данные, выберет первый подходящий формат из списка). Чтобы облегчить жизнь разработчику, Windows автоматически обеспечивает конвертацию некоторых типов форматов для буфера обмена. По окончании процесса программа вызывает CloseClipboard.
Когда пользователь нажимает кнопку «Вставить», целевое приложение вызывает OpenClipboard и одну из следующих функций для определения доступных форматов данных: IsClipboardFormatAvailable, GetPriorityClipboardFormat или EnumClipboardFormats. Если оно находит подходящий формат, то тогда вызывает GetClipboardData с идентификатором нужного формата в качестве параметра, чтобы получить данные. В конце приложение использует команду CloseClipboard для закрытия буфера.
Теперь взглянем, как с помощью отладчика определить, какие данные записаны в буфер обмена. (Заметьте, что все мои записи сделаны в системе Win7/2008 R2 — так что на других версиях ОС они могут выглядеть несколько иначе). Поскольку буфер является частью Win32k.sys, вам понадобится отладчик ядра. Я люблю использовать в качестве контрольной точки win32k!InternalSetClipboardData+0xe4 . В таком смещении хорошо то, что оно находится за регистром RDI, заполненным данными из SetClipboardData в структуре, известной как tagCLIP.
Вот как выглядит вызов к SetClipboardData от «Блокнота»:
Итак, теперь мы можем просмотреть содержимое RDI как tagCLIP и увидеть, что записано в буфер:
Fmt — это формат для буфера обмена. 0Xd — это число 13, что соответствует тексту в формате Юникода. Однако мы не можем просто запустить du по значению hData , потому что это дескриптор, а не прямой указатель на данные. Так что нужно поискать его в глобальной структуре win32k — gSharedInfo:
aheList в gSharedInfo содержит массив с дескрипторами, и последние два байта hData, умноженные на размер записи дескриптора, показывают адрес записи нашего дескриптора:
Если посмотреть phead со смещением 14, то мы получим наши данные (это смещение может отличаться на разных платформах):
Представим другой сценарий. Я скопировал какой-то текст из Wordpad, и команда SetClipboardData отработала определённое количество раз, чтобы разместить данные в разных форматах. Запись в формате Юникода выглядит так::
Теперь посмотрим, как приложение может отслеживать буфер обмена на предмет изменений. Это важно знать, потому что в этом месте Windows позволяет сторонним приложениям подключаться к системе. Если у вас наблюдаются непонятные глюки с копированием и вставкой, причиной может быть некорректное поведение какой-то из таких программ. Начнём с того, что рассмотрим механизмы подключения к буферу обмена. Затем рассмотрим, можно ли с помощью отладчика идентифицировать приложения, которые используют такие хуки.
Есть три способа отслеживать буфер обмена на предмет изменений: просмотр буфера, прослушивание форматов буфера и запрос порядкового номера буфера. Мы сосредоточимся на первых двух способах, потому что они предусматривают получение уведомлений, когда содержимое буфера обновилось. В третьем методе приложение должно само проверять каждый раз, изменился ли буфер, и этот метод нельзя использовать в цикле опросов.
Очевидная проблема подобной архитектуры состоит в следующем: она рассчитывает, что каждое приложение, следящее за буфером, будет вести себя корректно, не завершать неожиданно работу и в целом будет хорошим гражданином в системе. Если какое-то из приложений начнёт вести себя недружественно, то оно не отправит уведомление об изменении буфера обмена следующему приложению в цепочке, в результате чего вся цепочка останется без уведомлений.
Мы рассмотрели, как зарегистрировать просмотр/прослушивание буфера обмена. Теперь посмотрим, как с помощью отладчика определить, какие программы участвуют в этих процессах. Сначала нужно идентифицировать процесс в сессии, где мы хотим проверить мониторинг буфера обмена. Это может быть любой процесс win32 в этой сессии — он нужен нам просто для того, чтобы найти указатель на Window Station. В этом случае я бы использовал окно «Блокнота», как и раньше:
Если вы делаете это в процессе отладки ядра, то понадобится интерактивно сменить контекст (используя .process /I<address> , затем нажать g и подождать, пока отладчик прорвётся назад). Теперь запускаем DT на адрес процесса как _EPROCESS , и смотрим на поле Win32Process:
Далее посмотрим адрес Win32Process как win32k!tagPROCESSINFO и узнаем значение rpwinsta:
Это наша Window Station. Сливаем содержимое через dt:
Ели мы знаем окно, то осталось несколько шагов, чтобы узнать, к какому процессу оно относится. Нас интересуют forspwndClipViewer, spwndClipboardListener и spwndClipOwner. Сначала запускаем dt, чтобы узнать значение tagWND. Для этой демонстрации мы используем spwndClipViewer:
Нас интересует только значение head — так что если смещение 0, делаем dt для того же адреса на _THRDESKHEAD:
Теперь запускаем dt для адреса, указанного в поле pti как tagTHREADINFO:
Теперь нам интересно только значение поля pEThread, которое мы можем передать в !thread:
Как видим, просмотр буфера обмена зарегистрировн от имени процесса viewer02.exe. Поскольку просмотр идёт по цепочке, определить следующий процесс в цепочке будет непросто. Но мы можем сделать это для тех, кто прослушивает буфер. Снова взглянем на нашу Window Station:
Если запустить dt на spwndClipboardListener, то увидим поле spwndClipboardListenerNext с указанием следующего прослушивающего процесса:
При достижении последнего процесса в списке прослушивающих буфер tagWND, значение его поля spwndClipboardListenerNext будет нулевым:
Используя адрес окна, мы можем тем же методом добраться до названия процесса. Как упоминалось ранее, поскольку tagWND — это структура ядра, ОС сама хранит указатели spwndClipboardListener/spwndClipboardListenerNext, так что они не могут привести к таким проблемам с отслеживанием буфера, как цепочки просмотра.
На этом заканчивается наш обзор буфера обмена Windows. Надеюсь, для вас он стал информативным. Хотите узнать больше о мониторинге буфера обмена? Вот хорошая статья MSDN об этом.
Читайте также: