Перейти на главную страничку сайта (список статей, файлы для скачивания)
Проект перевода документации AutoHotkey: перечень переведённых статей и статей в работе.
Оригинал статьи в AutoHotkey.chm: "Send / SendRaw / SendInput / SendPlay / SendEvent: Send Keys & Clicks", в содержании - "Keyboard Control" - "Send/SendRaw/SendInput/SendPlay/SendEvent", v1.0.47.06.
Ник переводчика: YMP.
Настоящее имя переводчика: Юрий Попов.
Посылает нажатия клавиш и щелчки мыши в активное окно.
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, как правило, является предпочтительным способом посылки нажатий благодаря его высокой скорости и надёжности. В большинстве случаев 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 заключается в его способности взаимодействовать с более широким спектром игр. Например, какая-либо игра может принимать строки автозамены, только если они имеют опцию 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 При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.