Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также саму программу AutoHotkey и проблемы её использования)

Проект перевода документации AutoHotkey: перечень переведённых статей и статей в работе.

Оригинал статьи в AutoHotkey.chm: "Clipboard, ClipboardAll, and OnClipboardChange", по ссылке из статьи "ClipWait", в содержании - "Environment Management" - "ClipWait".

Ник переводчика: NikVasKo.

Настоящее имя переводчика: Николай Козлов, г. Москва.

Clipboard, ClipboardAll, и OnClipboardChange

Clipboard является встроенной переменной, повторяющей содержимое клипборда Windows, если оно ограничивается текстом. В противоположность ей, ClipboardAll полностью повторяет клипборд, включая картинки и форматирование.

Каждая строка текста из Clipboard обычно заканчивается кодами carriage return и linefeed (CR+LF), которые в скрипте записываются как `r`n. Файлы (например, скопированные из окна Проводника с помощью Control-C) рассматриваются как текст: т.е. они автоматически преобразуются в их имена (с полными путями) при обращении скрипта к Clipboard. Выделить имя каждого из нескольких файлов можно так:

Loop, parse, clipboard, `n, `r
{
    MsgBox, 4, , File number %A_Index% is %A_LoopField%.`n`n Дальше?
    IfMsgBox, No, break
}

Чтобы расставить имена файлов по алфавиту, воспользуйтесь командой Sort. Имена файлов из клипборда в файл сохранит команда: FileAppend, %clipboard%`r`n, C:\My File.txt. Слово #ClipboardTimeOut определит, как долго скрипт будет ожидать открытия клипборда - например, когда с клипбордом работает другое приложение.


Простые примеры:

clipboard = my text ; Полностью заменяет содержимое клипборда.
clipboard = ; Очищает клипборд.
clipboard = %clipboard% ; Превращает в простой текст.
clipboard = %clipboard% Текст для добавления. ; Дописывает клипборд.
StringReplace, clipboard, clipboard, ABC, DEF, All
    ; Заменяет в клипборде все ABC на DEF (и преобразует клипборд в текст).

ClipWait делает скрипт надежнее:

clipboard = ; Очищаем клипборд, чтобы ClipWait могла обнаружить появление нового текста.
Send ^c
ClipWait ; ждем, пока появится текст.
MsgBox Control-C поместила в клипборд следующее:`n`n%clipboard%

ClipboardAll (полное сохранение и восстановление клипборда)

ClipboardAll полностью повторяет клипборд (с картинкам и форматированием). Чаще всего переменная используется, чтобы сохранить клипборд, дабы скрипт мог временно занять его для своих дел. Когда дело будет сделано, скрипт восстановит клипборд, например так:

ClipSaved := ClipboardAll ; Сохраняет клипборд полностью в указанной переменной.
    ; ... здесь можно временно использовать клипборд, например,
    ; для сохранения текста Unicode с помощью Transform Unicode...
Clipboard := ClipSaved ; Восстанавливает клипборд.
    ; Заметьте - использован Clipboard (а не ClipboardAll).
ClipSaved = ; Освобождает память, когда клипборд громоздок.

ClipboardAll также может быть сохранена в файл (в этом режиме FileAppend всегда перезаписывает существующий файл):

FileAppend, %ClipboardAll%, C:\Company Logo.clip ; Расширение файла не имеет значения.

Для последующего восстановления файла в клипборде (или в переменной) следуйте следующему образцу:

FileRead, Clipboard, *c C:\Company Logo.clip ; Обратите внимание на *c перед именем файла

Примечания


ClipboardAll будет пустым, если его использовать не так, как описано выше. Более того, если переменной присвоить значение ClipboardAll, то она будет иметь бинарный формат и, следовательно, будет выглядеть абракадаброй при отображении через MsgBox или другую подобную команду. С другой стороны, изменение бинарной переменной (средствами вроде StringReplace) превращает ее в обычную, и данные клипборда при этом теряются. Начиная с версии 1.0.46, бинарные переменные можно передавать функциям по значению (прежде отрабатывалось только ByRef).

Когда ClipboardAll не может вернуть в клипборд данные одного или нескольких объектов (форматов), они пропускаются, но все остальные объекты будут восстановлены. Начиная с версии 1.0.42.03, попытка получения данных повторяется согласно #ClipboardTimeOut многократно (раньше только один раз).

Переменную, содержащую данные клипборда, можно копировать в другую переменную, как в этом примере: ClipSaved2 := ClipSaved

Чтобы обнаружить появление в клипборде данных (возможно, включающих нетекстовые), можно использовать ClipWait.

Общий объем переменной, в которую был передан ClipboardAll, может определить команда StringLen.

Переменные, которым было присвоено содержание ClipboardAll, можно сравнивать друг с другом (но не с ClipboardAll непосредственно) с помощью операторов <> и =. В следующем примере сначала определяются объемы каждой переменной. (Прим. переводчика: здесь, видимо, есть оговорка: в примере нет определения объемов. Предположим, что подразумевалось: "При сравнении переменных иногда можно ограничиться сравнением из размеров"). Если это не дает достаточной определенности, можно применить сравнение контентов:

if ClipSaved1 <> %ClipSaved2% ; Здесь нужно использовать IF старого стиля (не выражение!).
    MsgBox Два сохраненных клипборда не совпадают

Сохранение ClipboardAll в переменной не ограничивается объемом, задаваемым в #MaxMem.

Внутренняя структура файла, сохраненного в клипборде, состоит из 4-х байт с типом формата, за которым следуют 4 байта с размером блока данных, за которым следует сам блок данных в указанном формате. Если в клипборде содержался более чем один формат (а это почти всегда так), эти три блока повторяются нужное число раз. Файл заканчивается 4-мя байтами типа формата, состоящими из 0 (Прим. переводчика: туманное место).

OnClipboardChange [v1.0.35.10+]

Метке OnClipboardChange (если такая существует) автоматически передается управление, как только какое-либо приложение (или даже сам скрипт) изменит клипборд. Эта передача происходит также при первом запуске скрипта.

Встроенная переменная A_EventInfo содержит:

В версиях ранее 1.0.36 вместо ErrorLevel следует использовать A_EventInfo. В более поздних версиях обе переменные исходно имеют одинаковое содержание, но A_EventInfo предпочтительна, поскольку она не изменяется командами, которые изменяют ErrorLevel.

Работоспособен следующий скрипт. Пока он работает, после каждого изменения клипборда коротко высвечивается сообщение:

#Persistent
return

OnClipboardChange:
ToolTip Тип данных в клипборде: %A_EventInfo%
Sleep 1000
ToolTip ; Гасит сообщение
return

Когда клипборд изменяется при исполнении нити за меткой OnClipboardChange, уведомление об изменении теряется. Если такое неприемлемо, в первой строке за меткой поместите Critical. Однако, эта мера также отсрочит исполнение других нитей (подобных обработке горячих клавиш) на время исполнения нити OnClipboardChange.

Если сам скрипт изменяет клипборд, нить за меткой OnClipboardChange обычно исполняется не сразу; это значит, что команды, стоящие непосредственно за командой изменившей клипборд, скорее всего будут исполнены раньше. Чтобы заставить нить исполняться немедленно, после команды на изменение клипборда можно добавить короткую задержку Sleep 20.

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.