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

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

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

Оригинал статьи в AutoHotkey.chm: "Send / SendRaw / SendInput / SendPlay / SendEvent: Send Keys & Clicks", в содержании - "Keyboard Control" - "Send/SendRaw/SendInput/SendPlay/SendEvent", v1.0.47.06.

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

Настоящее имя переводчика: Юрий Попов.

Send / SendRaw / SendInput / SendPlay / SendEvent: Send Keys & Clicks

Посылает нажатия клавиш и щелчки мыши в активное окно.

Send Keys
SendRaw Keys
SendInput Keys
SendPlay Keys
SendEvent Keys

Параметры

Keys Последовательность посылаемых клавиш. Как и в других командах, запятая перед первым параметром необязательна.

Режим Raw (как есть): Команда SendRaw посылает клавиши в точности как они указаны, т.е. не преобразует {Enter} в нажатие клавиши Enter или ^c в нажатие Control-C и т.п. Чтобы использовать этот режим в командах SendInput, SendPlay или SendEvent, напишите {Raw} в начале посылаемой строки, например: SendInput {Raw}abc.

Нормальный режим: В этом режиме нижеследующие символы интерпретируются как модификаторы (они модифицируют только идущую непосредственно за ними клавишу).

!: Посылает нажатие Alt. Например, команда Send This is text!a пошлёт "This is text" и затем комбинацию Alt+a. Замечание: в некоторых программах !A - не то же самое, что !a. Причина в том, что !A нажимает Alt+Shift+a, в то время как !a нажимает Alt+a. Если сомневаетесь, используйте нижний регистр.

+: Посылает нажатие Shift. Например, Send +abC пошлёт текст "AbC", а Send !+a пошлёт комбинацию Alt+Shift+a.

^: Посылает нажатие Control. Например, ^!a нажмёт Ctrl+Atl+a, Send ^{Home} пошлёт Ctrl+Home. Замечание: в некоторых программах ^A - не то же самое, что ^a, поскольку ^A посылает Ctrl+Shift+a, в то время как ^a посылает Ctrl+a. Если сомневаетесь, используйте нижний регистр.

#: Посылает нажатие Win, т.е. Send #e нажмёт клавишу Windows и, удерживая её, нажмёт клавишу "e".

SendInput и SendPlay [с версии 1.0.43]: SendInput и SendPlay используют тот же синтаксис, что и Send, но работают, как правило, быстрее и более надёжно. Кроме того они буферизуют физические нажатия на клавиши и кнопки мыши, которые происходят во время посылки, что не позволяет нажатиям пользователя смешиваться с теми, которые посылает скрипт. С помощью команды SendMode можно сделать команду Send синонимом SendInput или SendPlay. Более детальное описание каждого из режимов смотрите в разделах SendInput и SendPlay ниже.

SendEvent [с версии 1.0.43]: SendEvent использует для посылки тот же метод, что и команда Send в версиях до 1.0.43. Скорость посылки нажатий задаётся командой SetKeyDelay. По умолчанию, Send является синонимом SendEvent, но может быть сделана синонимом SendPlay или SendInput с помощью команды SendMode.

Имена клавиш. В списке ниже перечислены имена специальных клавиш, которые можно посылать (каждое имя должно заключаться в фигурные скобки).


Имя клавишиРезультирующее нажатие
{F1} - {F24} Функциональные клавиши. Например, {F12} означает клавишу F12.
{!}!
{#}#
{+}+
{^}^
{{}{
{}}}
{Enter}ENTER на основной клавиатуре
{Escape} или {Esc}ESCAPE
{Space}Пробел (такое обозначение нужно только для пробелов в начале или конце строки, пробелы в середине могут быть обычными)
{Tab}TAB
{Backspace} или {BS}Backspace
{Delete} или {Del}Delete
{Insert} или {Ins}Insert
{Up}Стрелка вверх на основной клавиатуре
{Down}Стрелка вниз на основной клавиатуре
{Left}Стрелка влево на основной клавиатуре
{Right}Стрелка вправо на основной клавиатуре
{Home}Home на основной клавиатуре
{End}End на основной клавиатуре
{PgUp}Page Up на основной клавиатуре
{PgDn}Page Down на основной клавиатуре
  
{CapsLock}CapsLock (использование команды SetCapsLockState более надёжно в NT/2k/XP)
{ScrollLock}ScrollLock (см. также SetScrollLockState)
{NumLock}NumLock (см. также SetNumLockState)
  
{Control} или {Ctrl}CONTROL (посылается код нейтральной виртуальной клавиши и левый сканкод)
{LControl} или {LCtrl}Левый CONTROL (то же, что CONTROL в Win9x, но в NT/2k/XP будет послан код левой виртуальной клавиши)
{RControl} или {RCtrl}Правый CONTROL
{Control Down} или {Ctrl Down}Нажимает и удерживает CONTROL пока не будет послан {Ctrl Up}. XP/2000/NT: Чтобы удерживать конкретно левый или правый Control, используйте {LCtrl Down} и {LCtrl Up}, {RCtrl Down} и {RCtrl Up}.
  
{Alt}ALT (посылается код нейтральной виртуальной клавиши и левый сканкод)
{LAlt}Левый ALT (то же, что ALT в Win9x, но в NT/2k/XP посылается код левой виртуальной клавиши)
{RAlt}Правый ALT (или AltGr, в зависимости от раскладки клавиатуры)
{Alt Down}Нажимает и удерживает ALT пока не будет послан {Alt Up}. XP/2000/NT: Чтобы удерживать конкретно левый или правый Alt, используйте {LAlt Down} и {LAlt Up}, {RAlt Down} и {RAlt Up}.
  
{Shift}SHIFT (посылает код нейтральной виртуальной клавиши и левый сканкод)
{LShift}Левый SHIFT (то же, что SHIFT в Win9x, но в NT/2k/XP посылается код левой виртуальной клавиши)
{RShift}Правый SHIFT
{Shift Down}Нажимает и удерживает SHIFT пока не будет послан {Shift Up}. XP/2000/NT: Чтобы удерживать конкретно левый или правый Shift, используйте {LShift Down} и {LShift Up}, {RShift Down} и {RShift Up}.
  
{LWin}Левая клавиша Windows
{RWin}Правая клавиша Windows
{LWin Down}Нажимает и удерживает левую клавишу Windows пока не будет послан {LWin Up}
{RWin Down}Нажимает и удерживает правую клавишу Windows пока не будет послан {RWin Up}
  
{AppsKey}Клавиша контекстного меню
{Sleep}Клавиша SLEEP
{ASC nnnnn} Посылает комбинацию Alt с кодом символа (набираемого на цифровой клавиатуре), которая может быть использована для генерации символов, которые не существуют на клавиатуре. Чтобы сгенерировать символы ASCII, используйте коды от 1 до 255. Для символов ANSI (стандарт для большинства языков) используйте коды от 128 до 255, но добавьте в начало 0, например {Asc 0133}.

Для символов Unicode указывайте коды от 256 до 65535 (без нуля в начале). Однако это поддерживается не всеми приложениями. Поэтому для большей совместимости и упрощения посылки длинных строк в Unicode используйте команду Transform Unicode.
{vkXX}
{scYYY}
{vkXXscYYY}
Посылает нажатие, которое имеет код виртуальной клавиши XX и сканкод YYY. Например: Send {vkFFsc159}. Если sc- или vk-часть опущена, вместо неё посылается наиболее подходящее значение.

Значения XX и YYY шестнадцатеричные и обычно могут быть определены через пункт меню View - Key history в главном окне скрипта (это окно открывается через пункт Open в меню значка в трее). См. также раздел "Специальные клавиши" на странице "Список клавиш и кнопок мыши/джойстика".
  
{Numpad0} - {Numpad9}Цифры на цифровой (дополнительной) клавиатуре. Например, {Numpad5} - это цифра 5.
{NumpadDot}Точка на цифровой клавиатуре.
{NumpadEnter}Enter на цифровой клавиатуре.
{NumpadMult}Умножение на цифровой клавиатуре.
{NumpadDiv}Деление на цифровой клавиатуре.
{NumpadAdd}Плюс на цифровой клавиатуре.
{NumpadSub}Минус на цифровой клавиатуре.
  
{NumpadDel}Delete на цифровой клавиатуре.
{NumpadIns}Insert на цифровой клавиатуре.
{NumpadClear}Clear на цифровой клавиатуре (обычно это клавиша '5', когда выключен NumLock).
{NumpadUp}Стрелка вверх на цифровой клавиатуре.
{NumpadDown}Стрелка вниз на цифровой клавиатуре.
{NumpadLeft}Стрелка влево на цифровой клавиатуре.
{NumpadRight}Стрелка вправо на цифровой клавиатуре.
{NumpadHome}Home на цифровой клавиатуре.
{NumpadEnd}End на цифровой клавиатуре.
{NumpadPgUp}Page Up на цифровой клавиатуре.
{NumpadPgDn}Page Down на цифровой клавиатуре.
  
{Browser_Back}2000/XP/Vista+: Выбор кнопки "Назад" в браузере.
{Browser_Forward}2000/XP/Vista+: Выбор кнопки "Вперед" в браузере.
{Browser_Refresh}2000/XP/Vista+: Выбор кнопки "Обновить" в браузере.
{Browser_Stop}2000/XP/Vista+: Выбор кнопки "Остановить" в браузере.
{Browser_Search}2000/XP/Vista+: Выбор кнопки "Поиск" в браузере.
{Browser_Favorites}2000/XP/Vista+: Выбор кнопки "Избранное" в браузере.
{Browser_Home}2000/XP/Vista+: Запустить браузер и перейти на домашнюю страницу.
{Volume_Mute}2000/XP/Vista+: Выключить/включить главный регулятор звука. Обычно эквивалентно команде SoundSet, +1, , mute
{Volume_Down}2000/XP/Vista+: Уменьшить громкость на главном регуляторе. Обычно эквивалентно SoundSet -5
{Volume_Up}2000/XP/Vista+: Увеличить громкость на главном регуляторе. Обычно эквивалентно SoundSet +5
{Media_Next}2000/XP/Vista+: Выбор следующего трека в медиа-проигрывателе.
{Media_Prev}2000/XP/Vista+: Выбор предыдущего трека в медиа-проигрывателе.
{Media_Stop}2000/XP/Vista+: Остановка медиа-проигрывателя.
{Media_Play_Pause}2000/XP/Vista+: Пауза/продолжение в медиа-проигрывателе.
{Launch_Mail}2000/XP/Vista+: Запуск приложения электронной почты.
{Launch_Media}2000/XP/Vista+: Запуск медиа-проигрывателя.
{Launch_App1}2000/XP/Vista+: Запуск пользовательского приложения 1.
{Launch_App2}2000/XP/Vista+: Запуск пользовательского приложения 2.
  
{PrintScreen}PrintScreen
{CtrlBreak}Ctrl+Break
{Pause}Pause
  
{Click [Options]}
[с версии 1.0.43]
Посылается щелчок мыши, при этом доступны те же опции, что и для команды Click. Например, {Click} щёлкнет один раз левой кнопкой в текущей позиции указателя, а {Click 100, 200} щёлкнет в точке с координатами 100, 200 (основываясь на CoordMode). Чтобы переместить мышь без щелчка, поставьте 0 после координат; например, {Click 100, 200, 0}. Паузу между щелчками задаёт SetMouseDelay (не SetKeyDelay).
{WheelDown}, {WheelUp}, {LButton}, {RButton}, {MButton}, {XButton1}, {XButton2} Посылается событие кнопки или колеса мыши в текущей позиции указателя (изменение позиции и другие возможности смотрите в описании {Click} выше. Задержку между щелчками задаёт SetMouseDelay.
{Blind} Когда {Blind} стоит первым в посылаемой строке, клавиши Alt/Control/Shift/Win, находящиеся в нажатом состоянии, не будут отпущены перед посылкой строки. Например, комбинация +s::Send {Blind}abc пошлёт ABC, а не abc, поскольку пользователь держит нажатым Shift.

{Blind} также влечёт за собой игнорирование SetStoreCapslockMode, т.е. состояние CapsLock не будет изменено. Наконец, при использовании {Blind} не посылаются дополнительные нажатия Control. Эти нажатия предотвращают: 1) активацию Главного меню во время нажатий LWin/RWin; 2) активацию строки меню окна при посылке Alt.

Режим Blind внутренне используется при переназначении клавиш. Например, переназначение a::b будет выдавать: 1) "b", когда вы нажмёте "a"; 2) "B" при нажатии "A" (в верхнем регистре); 3) Control-B при нажатии Control-A.

{Blind} не поддерживается командами SendRaw и ControlSendRaw, а также не полностью поддерживается командой SendPlay, особенно когда дело касается клавиш-модификаторов (Control, Alt, Shift, Win).
{Raw}
[с версии 1.0.43]
Посылает строку буквально как она есть, т.е. не преобразует {Enter} в нажатие клавиши Enter, ^c в нажатие Control-C и т.п. Действие {Raw} распространяется на ту часть строки, которая следует после него.

Повтор или удержание клавиши

Чтобы повторить нажатие несколько раз, заключите в фигурные скобки имя клавиши и число повторов. Например:

Send {DEL 4}   ; Нажать Delete 4 раза.
Send {S 30}    ; Послать 30 S в верхнем регистре.
Send +{TAB 4}  ; Нажать Shift-Tab 4 раза.

Чтобы удерживать нажатой или отпустить клавишу, поместите в фигурные скобки её имя и слово Down (вниз) или Up (вверх). Например:

Send {b down}{b up}
Send {TAB down}{TAB up}
Send {Up down}  ; Нажать клавишу "Стрелка вверх".
Sleep 1000  ; Держать её нажатой 1 секунду.
Send {Up up}  ; Отпустить.

Когда клавиша удерживается вышеописанным методом, не происходит её автоповтор, как это было бы при физическом удержании (причина в том, что автоповтор является возможностью драйвера/оборудования). Однако для симуляции автоповтора можно использовать Loop. Следующий пример посылает 20 нажатий Tab:

Loop 20
{
    Send {Tab down}  ; Автоповтор состоит из цепочки событий Down (без Up).
    Sleep 30  ; Пауза в миллисекундах между нажатиями (либо используйте SetKeyDelay).
}
Send {Tab up} ; Отпустить клавишу.

Вместо Down также можно использовать DownTemp. Эффект будет тот же, за исключением клавиш-модификаторов (Control/Shift/Alt/Win). В последнем случае DownTemp сообщает следующим за ним посылающим командам, что модификаторы не являются постоянно нажатыми, т.е. они могут отпускаться, если это нужно. Например, если за командой Send {Control DownTemp} следует команда Send a, ею будет послано обычное нажатие "а", а не комбинация Control-A.

Общие замечания

В добавок к буквам от A до Z, также поддерживаются следующие буквы и символы (однако, если кодовая страница вашей системы отлична от 1252 [США и Западная Европа], этот список может быть иным):

€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿

ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ

BlockInput в сравнении с SendInput/SendPlay: Хотя команда BlockInput может быть использована для защиты симулируемых скриптом нажатий от прерывания физическими нажатиями, производимыми пользователем, для этой цели часто лучше использовать SendInput или SendPlay. Их преимущество в том, что они не отбрасывают то, что печатает пользователь во время посылки; его нажатия запоминаются и посылаются позже.

Если нужно послать большое количество нажатий, их можно поместить в секцию продолжения, чтобы улучшить читабельность скрипта.

Поскольку операционная система не позволяет симуляцию комбинации CTRL-ALT-DELETE, команды вроде ^!{Delete} работать не будут.

SendInput [с версии 1.0.43]

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

В отличие от других методов, SendInput имеет ограничение со стороны операционной системы на количество посылаемых символов - не более 5000. Это число может варьироваться в зависимости от версии операционной системы и настроек производительности. Символы и события сверх этого лимита не посылаются.

Замечание: SendInput игнорирует SetKeyDelay, поскольку операционная система не поддерживает задержки для этого режима. Однако когда SendInput сбрасывается в SendEvent при условиях, описанных ниже, он использует SetKeyDelay -1, 0 (исключение: если задержки для SendEvent были установлены как "-1,-1", то используется эта настройка). Если SendInput сбрасывается в SendPlay, он использует его задержки.

Если какой-то другой скрипт (не тот, где выполняется SendInput) установил низкоуровневый хук клавиатуры, SendInput автоматически переключается в SendEvent (или в SendPlay, если действует команда SendMode InputThenPlay). Это делается потому, что присутствие внешнего хука сводит на нет все преимущества SendInput, делая его хуже как SendPlay, так и SendEvent. Однако поскольку SendInput не способен обнаруживать низкоуровневые хуки, установленные другими программами, а только AutoHotkey с версии 1.0.43, в этих случаях он не будет переключаться, что сделает его менее надёжным, чем SendPlay/Event.

Когда SendInput посылает щелчки мыши способами вроде {Click}, и действует команда CoordMode Mouse, Relative (настройка по умолчанию), координаты щелчков будут относительны к окну, которое было активным в момент начала посылки. Поэтому, если SendInput в процессе посылки намеренно активирует другое окно (например, через Alt-Tab), координаты последующих щелчков будут неверными, поскольку они останутся относительными к прежнему окну, а не к новому.

Windows 95 (и NT4 до SP3): SendInput не поддерживается и будет автоматически сброшен в SendEvent (или в SendPlay, если действует команда SendMode InputThenPlay).

SendPlay [с версии 1.0.43]

Наибольшее преимущество SendPlay заключается в его способности взаимодействовать с более широким спектром игр. Например, какая-либо игра может принимать строки автозамены, только если они имеют опцию SendPlay.

Из трёх режимов посылки, SendPlay самый необычный, так как он не симулирует нажатия и щелчки как таковые. Вместо этого он создаёт последовательность событий (сообщений), которые идут напрямую активному окну (наподобие ControlSend, но на более низком уровне).

Как и у SendInput, нажатия SendPlay не смешиваются с теми, что производит пользователь. Нажатия пользователя запоминаются и посылаются позже.

Хотя SendPlay значительно медленнее SendInput, он обычно быстрее, чем традиционный SendEvent (даже с задержкой -1).

SendPlay неспособен вызывать срабатывание системных горячих клавиш, использующих клавиши Windows (LWin и RWin). Например, он не может вызвать Главное меню или открыть диалог "Выполнить" через Win-R.

Клавиши Windows (LWin и RWin) автоматически блокируются во время SendPlay, если установлен хук клавиатуры. Это предотвращает появление Главного меню, если пользователь случайно нажмёт клавишу Windows во время посылки. Другие клавиши не нуждаются в такой блокировке, поскольку операционная система буферизует их нажатия до момента окончания SendPlay.

SendPlay не использует стандартные настройки SetKeyDelay и SetMouseDelay. По умолчанию, задержки у него отсутствуют вообще. Как их можно изменить, показано в примерах ниже:

SetKeyDelay, 0, 10, Play ; Учтите, что 0 и -1 - это одно и то же для SendPlay.
SetMouseDelay, 10, Play

SendPlay не может включать и выключать CapsLock, NumLock и ScrollLock. Также он не может изменить состояние клавиш, которое считывается через GetKeyState, разве только нажатия посылаются в какое-либо из окон самого скрипта. Даже в этом случае изменения состояний левых и правых клавиш-модификаторов (например, RControl) могут быть считаны только через их нейтральный вариант (например, Control). SendPlay также имеет и другие ограничения, о которых рассказано в описании команды SendMode.

В отличие от SendInput и SendEvent, пользователь может прервать работу SendPlay, нажав Control-Alt-Del или Control-Escape. Когда такое происходит, оставшиеся нажатия не посылаются, но скрипт продолжает выполняться, как если бы SendPlay завершился нормально.

Хотя SendPlay может посылать события LWin и RWin, но они посылаются в активное окно и не выполняют своей обычной функции в операционной системе. Чтобы обойти это, используйте SendEvent. Например, команда SendEvent #r вызовет диалог "Выполнить".

В отличие от SendInput, SendPlay работает даже в Windows 95 и NT4 до SP3.

Примеры

; Примечание переводчика: посылка русских букв работает нормально,
; если принимающее окно переключено на русский язык.
Send Искренне ваш,{enter}Джон Смит  ; Печатает подпись на двух строках.
Send !фс ; Выбор пункта Файл -> Сохранить (Alt+Ф и затем С).
Send {End}+{Left 4} ; Перейти в конец текста, затем послать 
                    ; 4 нажатия Shift+Стрелка влево.
SendInput {Raw}Длинная последовательность символов, посылаемая без интерпретации.

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

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