Многократное сохранение текста в буфере обмена без потери данных

Дата публикации:2005
Поделиться в Twitter Поделиться в F******k Поделиться в VKontakte Поделиться в Telegram Поделиться в Mastodon

Несмотря на то что уже после публикации этой статьи в JAWS версии 7.00 появилась поддержка Буфера обмена с накоплением текста, эта публикация остаётся полезной в качестве примера использования функций языка сценариев JAWS для работы с Буфером обмена.

Буфер обмена (clipboard) в операционной системе MS Windows служит для временного хранения данных (текста, картинок, звука, видео и пр.) во время операций копирования и вставки. Это весьма удобно, поскольку позволяет копировать данные из одного приложения в другое (например, из электронной таблицы в текстовый редактор). Но вот есть одна неприятная мелочь, из-за которой приходится порой выполнять много лишней работы. Речь идёт о том, что новые данные, попадая в Буфер обмена, уничтожают информацию, находившуюся там прежде. Представьте, что необходимо из одного текстового документа скопировать десяток цитат в другой документ. Чтобы это сделать, придётся десять раз повторить следующее: выделить одну цитату, скопировать её в Буфер обмена, переключиться на другой документ, вставить текст из Буфера обмена, вернуться в прежний документ. Было бы гораздо проще, если бы удалось сначала скопировать все цитаты в Буфер обмена, а затем поместить их в нужный документ. Именно эту задачу мы и постараемся решить средствами языка сценариев JAWS.

Сразу следует отметить, что разговор пойдет исключительно о текстовых данных. Для реализации многократного сохранения в Буфере обмена нетекстовых данных (графики, видео, аудио и т.п.) следует использовать специальные программы, расширяющие функциональность Буфера обмена.

Начиная с JAWS версии 5.10 язык сценариев пополнился встроенной функцией GetClipboardText (), позволяющей получать текст из Буфера обмена и присваивать его какой-либо строковой переменной. До этого из скриптов JAWS можно было лишь сохранять текст в Буфере обмена. Стоит отметить, что появление функции GetClipboardText () декларируется разработчиками программы JAWS ещё в версии 5.00. Однако не во всех субверсиях версии 5.00 эта функция присутствует, поэтому будем считать, что функция достоверно поддерживается в версии 5.10 и выше.

Всего же в скриптах для JAWS версии 5.10 и выше можно использовать четыре функции для работы с Буфером обмена:

  • ClipboardChangedEvent () - доступна в версии 4.51 и выше.
  • ClipboardHasData () - доступна в версии 4.51 и выше.
  • CopyToClipboard () - доступна в версии 4.51 и выше.
  • GetClipboardText () - доступна в версии 5.10 и выше.

Дополнительную информацию об этих функциях можно почерпнуть из Справочника разработчика скриптов. Там же есть описание встроенных скриптов для работы с Буфером обмена.

Из четырёх указанных функций нас интересуют две последние. С помощью них можно организовать сохранение данных в Буфере обмена с накоплением его содержимого. Алгоритм действий весьма прост: прежде чем записывать данные в Буфер обмена, необходимо взять оттуда старые данные и сохранить их в промежуточной строковой переменной, затем объединить их с новыми данными и все это поместить в Буфер обмена. На основе этого алгоритма напишем скрипт, который можно поместить либо в файл скриптов по умолчанию (default.jss), либо в файл скриптов того текстового редактора, с которым вы работаете.

Приведённый ниже скрипт был проверен в JAWS версии 5.10. Необходимо, используя Диспетчер скриптов, ввести исходный код в файл скриптов и назначить комбинацию клавиш для вызова скрипта (например, Insert + Alt + C).

Include "HjConst.jsh"
; Скрипт для многократного копирования данных в Буфер обмена.
Script MultiClipboard()
Var
String sBuf1,
String sBuf2
let sBuf1 = GetSelectedText ()
If !StringIsBlank (sBuf1) Then
	let sBuf2 = GetClipboardText ()
	If !StringIsBlank (sBuf2) Then
		let sBuf1= sBuf2 + sBuf1
	EndIf
	CopyToClipboard (sBuf1)
	Say("Добавлено в буфер", OT_MESSAGE)
Else
	Say("Не выделен текст", OT_MESSAGE)
EndIf
endScript

Если компиляция скрипта прошла без ошибок, то вы можете приступать к работе с ним. Теперь во время работы в текстовом редакторе можно выделить текст и нажать комбинацию клавиш, назначенную этому скрипту, после чего прозвучит сообщение "Добавлено в буфер", означающее, что текст был добавлен в Буфер обмена к уже существующим данным. Затем можно выделить другой фрагмент текста и опять добавить его в буфер. Так можно повторять несколько раз, а потом весь накопленный в Буфере обмена текст вставить в документ при помощи меню Правка -> Вставить или комбинации клавиш Control+V. Следует учитывать, что после вставки из Буфера обмена текст не пропадает и может быть вставлен несколько раз подряд. Для того чтобы очистить Буфер обмена от накопившегося в нем текста, необходимо либо обычным способом скопировать в Буфер обмена пробел (меню Правка -> Копировать или комбинация клавиш Control + C), либо добавить ещё один скрипт, удаляющий данные из Буфера обмена. Ниже приведен пример такого скрипта:

Script ClearClipboard()
;Помещаем пробел в Буфер обмена.
CopyToClipboard (" ")
Say("Буфер очищен",OT_MESSAGE)
endScript

При использовании этого скрипта следует учитывать, что в процессе копирования в Буфер обмена средствами языка сценариев JAWS не сохраняется форматирование текста и иногда может нарушаться кодировка символов при работе в MS Windows XP. Кроме того, в некоторых текстовых редакторах при выделении строки целиком не выделяется символ перевода строки, поэтому при последовательном копировании нескольких строк в Буфер обмена они могут оказаться "склеившимися".



Распространение материалов сайта означает, что распространитель принял условия лицензионного соглашения.
Идея и реализация: © Владимир Довыденков и Анатолий Камынин,  2004-2024