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

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

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

Оригинал статьи в AutoHotkey.chm: "Frequently Asked Questions (FAQ)", в содержании - "FAQ (Frequently Asked Questions)"

Ник переводчика: Дед Мазай.

Настоящее имя переводчика: Антон Иваненко, г.Москва.

Часто задаваемые вопросы (FAQ)

Синтаксис языка

В каких случаях с командами и их параметрами используются кавычки?

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

Run, Notepad.exe "C:\My Documents\Address List.txt"

В каких случаях при работе с именами переменных используются значки процентов?

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

  1. В параметрах, которые являются входными или выходными переменными: StringLen, OutputVar, InputVar.
  2. В левой части присвоения строки переменной: Var = 123abc.
  3. В левой части не содержащего выражений if-оператора: If Var1 < %Var2%
  4. Везде в выражениях. Пример 1: If (Var1 <> Var2) ... Пример 2: Var1 := Var2 + 100

Можно ли использовать значки процентов и запятые как обычные клавиатурные символы?

Если вы хотите использовать значки процентов как обычные клавиатурные символы, то добавьте перед ними значок акцента:

F7::MsgBox На данный момент мы имеем целых 25`%.

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

В тех случаях, когда запятые или значки процентов заключены в кавычки в каком-либо выражении, использование акцента допускается, но большой необходимости в этом нет. Например: Var := "15%"

Общие задачи

Почему команда Run не запускает мою игру или программу?

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

Run, %ProgramFiles%\Some Application\App.exe, %ProgramFiles%\Some Application

Каким образом можно получить выходные данные при выполнении операции в командной строке?

Небольшая бесплатная утилита cb.zip (4 KB) захватывает до 512 Кб выходных данных команды или программы. Эта информация в виде текста записывается в буфер обмена, откуда к ней можно получить доступ при использовании соответствующей переменной, например:

RunWait %comspec% /c dir | cb.exe
MsgBox %clipboard%

Можно ли остановить повторяющеся действие, не закрывая при этом сам скрипт?

Для остановки исполнения скрипта (пауза) и возобновления его работы позднее, пропишите на какую-нибудь клавишу команду Pause, как в нашем примере:

^!p::Pause ; Нажатие комбинации Ctrl+Alt+P приостанавливает исполнение нашего скрипта.
;Для запуска его вновь нажмите Ctrl+Alt+P ещё раз.

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

#MaxThreadsPerHotkey 3
#z::  ; Комбинация клавиш Win+Z.
#MaxThreadsPerHotkey 1
if KeepWinZRunning = y  ; Эта запись соотносится с нижележащим тредом и обозначает,
;что наш Loop в данный момент исполняется. 
{
	KeepWinZRunning =  ; А здесь мы оставляем пустым, что обозначает остановку исполнения нашего цикла.
	Return  ; Собственно команда Return, закрывающая наш тред.
}
; А также:
KeepWinZRunning = y
Loop,
{
	ToolTip, Нажмите Win-Z снова для остановки появления этого окошка подсказки.
	Sleep, 1000
	ToolTip
	if KeepWinZRunning =  ; Здесь мы, нажимая Win-Z снова, даём сигнал на остановку нашего цикла.
		Break  ; Собственно команда Break, останавливающая исполнение нашего цикла.
	Sleep, 1000
}
KeepWinZRunning =  ; Reset (сброс) для подготовки к следующему нажатию наших "горячих клавиш".
Return

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

Если вы обнаружили, что горячие клавиши, команда GetKeyState, перемещения курсора (в скриптах, использующих кнопки мыши) недостаточно хорошо работают в приложениях с мощной загрузкой CPU, возможно, увеличение приоритета сможет вам помочь. Чтобы сделать это, добавьте следующую строку в заголовок вашего скрипта, что позволит увеличить его приоритет исполнения с нормальной до высокой степени. Эта запись сообщает операционной системе уделить больше внимания к исполнению данных команд:

Process, Priority, , High

Как определить, загрузилась ли веб-страница?

Техника, описанная ниже, успешно работает с большинством страниц, открываемых через MS Internet Explorer. Таким же способом строится работа и с другими браузерами:

#z::
Run, www.yahoo.com
MouseMove, 0, 0  ; Это сделано для предотвращения появления адреса ссылки, попавшей под курсор мыши, вместо
;нужного нам в строке состояния "Готово".
WinWait, Yahoo! - Microsoft Internet Explorer 
WinActivate 
StatusBarWait, Готово, 30
if ErrorLevel <> 0 
	MsgBox, Превышено время ожидания или окно закрыто. 
else 
	MsgBox, Ваша страничка загружена.
Return

Есть ли в программе способы сравнения или управления такими параметрами, как дата и время?

Команда EnvAdd может складывать или вычитать количество дней, часов, минут или секунд, и представлять эти данные в виде строки, имеющей вид YYYYMMDDHH24MISS, где:
YYYY - year (год)
MM - month (месяц)
DD - day (день)
HH24 - hour (час)
MI - minutes (минуты)
SS - seconds (секунды)
В следующем примере показано вычитание семи дней из указанной даты:

EnvAdd, VarContainingTimestamp, -7, days

Для вычисления количества прошедшего времени между двумя датами используйте команду EnvSub, как проиллюстрировано в примере из соответствующей статьи. Также, встроенная переменная A_Now содержит данные о текущем времени. И наконец, существуют ещё несколько встроенных переменных, работающих с датой/временем, как например команда FormatTime, использующаяся для создания строки даты/времени в произвольном формате.

Почему строки автозамены, команды Send и MouseClick не работают в некоторых играх?

Некоторые игры используют в своей работе только механизм DirectInput. Как следствие, такое приложение может игнорировать все эмуляции нажатий клавиш и кнопок мыши. Несмотря на то, что серьёзной работы по этому вопросу ещё не проводилось, было обнаружено, что для большинства игр увеличение параметра SetKeyDelay явилось эффективным для включения в работу команды Send. Попробуйте сделать так:

SetKeyDelay, 10, 10
SetKeyDelay, 0, 10

Также для обхода этой проблемы вы можете попробовать использовать другие программы для эмуляции нажатий клавиш и кнопок мыши, такие, как Journal Macro, QuicKeys, KeyGO, OnHand, и Toggle Keyboard.

Я использую несколько языковых раскладок на клавиатуре. Почему команда Send и строки автозамены иногда пропечатывают мне не те буквы?

Это происходит потому, что язык, на котором работает скрипт (английский) не совпадает с языковой раскладкой, выбранной вами для работы в конкретном приложении. Для синхронизации раскладок, вам нужно изменить "язык" для скриптов AutoHotkey. Сделать это можно вручную: простым двойным кликом на иконке скрипта в системном трее вызываем рабочее окно самого скрипта, далее меняем раскладку клавиатуры (обычно в Windows это LeftAlt+Shift), закрываем окно. Можно также воспользоваться следующим примером скрипта, автоматически меняющего языковую раскладку для скриптов AutoHotKey:

#z:: ; Комбинация клавиш Win+Z.
ListLines ; Эта команда открывает рабочее окно скрипта.
WinWaitActive ahk_class AutoHotkey
Sleep, 100
Send {LAlt Down}{Shift}{LAlt Up} ; Cобственно смена раскладки.
Sleep, 100
WinMinimize ; Эта команда сворачивает активное в данный момент окно.
Return

::втмм::вот так-то, милый мой
::btw::by the way

Дополнительная информация: как и любое другое приложение, каждый скрипт начинает работу с языком, установленным вами по умолчанию. Если эта установка не совпадает с языковой раскладкой, выбранной для приложения, куда вы "впечатываете" строки, скрипт может "перевести" их в нечто невообразимое.

Могу ли я управлять Winamp'ом, если его окно не является активным?

Смотрите статью "Управление Winamp'ом".

Как можно изменить надписи на кнопках, появляющихся в окошке MsgBox?

Смотрите пример в статье "Изменение надписей на кнопках в MsgBox".

Горячие клавиши, строки автозамены и переназначение клавиш

У меня возникли проблемы с использованием кнопок мыши в качестве "горячих клавиш". В чём тут может быть дело?

Во-первых, не все операционные системы поддерживают данную функцию. Вы не сможете воспользоваться всем набором команд AutoHotkey, если используете Windows 95/98/Me. Для других же операционных систем таких ограничений нет, и все кнопки должны работать (например, в качестве горячей клавиши вы можете использовать комбинацию Win+LeftButton, которая в скрипте записывается так "#LButton::"). Точно также доступны средняя кнопка мыши и повороты колеса, за исключением случаев, когда "особо злостные" драйвера для мыши напрямую контролируют эти кнопки.

Четвёртая (XButton1) и пятая кнопка мыши (XButton2) также доступны для программы, при условии, что драйвера мыши позволяют Windows "увидеть" их сигналы. Если же сигналы от этих кнопок Windows не видит, а также в том случае, когда на мыши есть ещё какие-либо дополнительные кнопки, вы можете сконфигурировать драйвера мыши таким образом, чтобы при нажатии этих дополнительных кнопок в Windows посылались бы нажатия стандартных клавиатурных клавиш, а уже их использовать в своих скриптах. Например, если вы в драйверах мыши установили на её четвёртую кнопку посылание сигналов нажатий комбинации клавиш Control+F12, то в своих скриптах можете спокойно программировать на горячие клавиши ^F12:: все, что вам нужно.

Если всё-таки пятая и четвертая кнопки вашей мыши остаются невидимыми для Windows, вы можете попробовать не устанавливать "родные" мышиные драйвера, а использовать вместо них драйвера по умолчанию для мыши Windows. Это может помочь, однако в этом случае вы, само собой, будете лишены возможности использовать расширенные функции, которые были заложены в "фирменные" драйвера.

Как использовать символы и знаки пунктуации в качестве горячих клавиш?

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

`::MsgBox, Вы нажали акцент.

При использования символов, для которых необходимо предварительное нажатие клавиши Shift (например @ и ?) необходимо прописывать комбинацию клавиш Shift и той клавиши, на которой находится искомый символ. Например, если вам нужно записать как горячие клавиши комбинацию Control+Звездочка, делаем так:

^+8::MsgBox, Вы нажали Ctrl+Shift+8 а это то же самое что и Ctrl+*.

Можно ли использовать комбинации клавиш-модификаторов как горячие клавиши?

Клавиши-модификаторы всегда соотносятся с именованными клавишами. Например, если вы хотите использовать комбинацию Ctrl+Alt+Win, используйте ^!LWin или ^!RWin вместо ^!#. Для клавиши Space используйте запись ^Space вместо "^ ". Примечание: клавиши-модификаторы нажимаются перед нажатием именованных клавиш. Так, в нашем первом примере сначала нажимаются клавиши Ctrl+Alt, а уж затем - LWin или RWin (правая или левая клавиша "Windows").

Как переназначить на клавиши или кнопки мыши другие символы/клавиши?

Смотрите статью о переназначении клавиш.

Можно ли сделать так, чтобы горячие клавиши или строки автозамены посылались исключительно для одной программы? Другими словами, во всех других приложениях эти клавиши работали бы как самые обычные клавиши, и только в нужной мне программе ими бы включались соответствующие скрипты?

В нижеприведенном примере клавиша NumpadEnter сконфигурирована таким образом, что работает как обычный NumpadEnter до тех пор, пока окно программы "CAD Editor" не становится активным. Обратите внимание на использование символа $ в записи "$NumpadEnter". Такая запись сообщает программе, что клавиша имеет возможность "посылать сама себя".

$NumpadEnter::
IfWinNotActive, CAD Editor
{
	Send, {NumpadEnter}
	Return
}
; Если же окно нашей программы стало активным, выполняется следующее действие:
Send, abc
Return

Рассмотрим также и другой метод, но он работает только в том случае, если программа "CAD Editor" изначально сконфигурирована таким образом, что совершенно не реагирует на нажатие клавиши NumpadEnter. Префикс из тильды (~) превращает NumpadEnter в незаблокированную горячую клавишу (клавишу, которая работает как "горячая клавиша", но при этом всегда посылается активному окну). То есть запись вида ~NumpadEnter позволяет использовать клавишу NumpadEnter как обычный NumpadEnter всё то время, пока она не запускает наш скрипт (это работает только в Windows NT/2k/XP):

~NumpadEnter::
IfWinNotActive, CAD Editor
	Return
; Если же окно нашей программы стало активным, выполняется следующее действие:
Send, abc
Return

Как сделать так, чтобы клавиша, нажимаемая первой в комбинации горячих клавиш, не исключалась из обработки, а продолжала выполнять свою системную функцию? (Windows NT/2K/XP)

Рассмотрим следующий пример:

Numpad0 & Numpad1::MsgBox, Вы нажали Numpad1, удерживая нажатым Numpad0.

Теперь сделаем так, чтобы Numpad0 работал как обычный Numpad0 до тех пор, пока он нам не понадобится для запуска нашей комбинации, описанной выше:

$Numpad0::Send, {Numpad0}

Префикс $ необходим для предотвращения появления диалога ошибки, сигнализирующей о возникновении бесконечного цикла (так как наша горячая клавиша "посылает сама себя"). В дополнение скажем, что команда выполняется в момент возвращения (подъёма вслед за нажатием) клавиши.

Существует ли способ, позволяющий использовать в своих целях "встроенные" в Windows сочетания клавиш, например такие, как Win+U (Utility Manager) и Win+R (Run)? Можно ли их изменить или отключить совсем?

Смотрите соответствующую статью о переназначении и запрещении горячих клавиш.

На моей клавиатуре есть специальная клавиша 000. Можно ли её использовать как горячую клавишу?

Да, вы можете её использовать, но при условии работы под Windows NT, 2000, или XP. В нашем примере показано, как можно использовать клавишу 000, превратив её в знак равенства. В строке скрипта "Send, =" Вы можете заменить знак равенства на всё, что вам угодно. Примечание: пример доступен по ссылке, которая имеется в оригинале этой статьи.

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

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