Перейти на главную страничку сайта (список статей, файлы для скачивания)
Проект перевода документации 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.info При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.