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

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

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

Оригинал статьи в AutoHotkey.chm: "#IfWinActive / #IfWinExist [v1.0.41/42+]", в содержании - "#Directives" - "#IfWinActive/Exist".

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

#IfWinActive / #IfWinExist [v1.0.41/42+]

Создает контекстно-чувствительные горячие клавиши [hotkeys] и строки автозамены [hotstrings]. Такие горячие клавиши выполняют различные действия (или не делают ничего) в зависимости от окна, которое является активным или существует.

#IfWinActive [, WinTitle, WinText]
#IfWinExist [, WinTitle, WinText]
#IfWinNotActive [, WinTitle, WinText]
#IfWinNotExist [, WinTitle, WinText]

Параметры

WinTitle
Заголовок окна
Заголовок или часть заголовка целевого окна (соответствующее поведение определяется командой SetTitleMatchMode в автовыполняющемся разделе). Чтобы использовать класс окна, укажите ahk_class ТочноеИмяКласса (показываемое Window Spy). Чтобы использовать группу окон, укажите ahk_group ИмяГруппы. Также поддерживаются ключевые слова ahk_pid и ahk_id, однако, почти всегда в #IfWin их можно использовать лишь косвенно, посредством команды GroupAdd (в качестве альтернативы используется "Hotkey IfWin"). Примечание переводчика: в #IfWin не допускается использование переменных вроде %Var%. Поэтому указывать в качестве параметров ahk_pid и ahk_id можно только в виде констант, например: #IfWinActive, ahk_id 0x4041e. Но в силу того, что эти константы меняются от запуска к запуску (являются уникальными идентификационными номерами процессов-приложений), практическое использование таких "констант" не представляется возможным. Но ahk_pid и ahk_id все-таки можно использовать косвенно, через добавление в группу, и уже группу использовать в качестве параметров в #IfWin. Однако и такой вариант может использоваться в очень ограниченном числе случаев из-за "изменчивости" ahk_pid и ahk_id. В общем случае в директивах #IfWin я рекомендую использовать ahk_class или ahk_group. Наконец, поиск может быть сужен множественными критериями. Например: My File.txt ahk_class Notepad
WinText
Текст окна
Если параметр указан, то он должен быть подстрокой отдельного текстового элемента целевого окна (как показывается утилитой Window Spy). Скрытые текстовые элементы обнаруживаются, если команда DetectHiddenText была включена в автовыполняющемся разделе (начальная часть скрипта).

Основные действия

Директивы #IfWin делают легким создание контекстно-чувствительных горячих клавиш [hotkeys] и строк автозамены [hotstrings]. Например:

#IfWinActive ahk_class Notepad
#space::MsgBox Вы нажали Win+Пробел в Блокноте.

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

Чтобы отключить контекстную чувствительность, укажите директиву #IfWin, но опустите все ее параметры. Например:

#IfWinActive

Когда #IfWin отключена (или вообще не используется в скрипте), все горячие клавиши и строки автозамены действуют во всех окнах (если они не заблокированы командой Suspend или командой Hotkey).

Если горячая клавиша клавиатуры или мыши заблокирована через #IfWin, то она выполняет свою обычную функцию, то есть направляется активному окну так, как если бы такой горячей клавиши и не было. Здесь есть два исключения: 1) Windows 95/98/Me: нажатие IfWin-заблокированной горячей клавиши не имеет никакого эффекта (даже для её обычной функции); и 2) Горячие клавиши джойстика: хотя #IfWin работает, но не изолируются другие программы от реакции на нажатие кнопки.

Варианты (дубликаты) горячих клавиш [v1.0.42+]

Горячая клавиша или строка автозамены могут быть назначены в скрипте больше одного раза, если каждое назначение имеет различные критерии #IfWin. Они известны как варианты горячей клавиши. Например:

#IfWinActive ahk_class Notepad
^!c::MsgBox Вы нажали Control+Alt+C в Блокноте.
#IfWinActive ahk_class WordPadClass
^!c::MsgBox Вы нажали Control+Alt+C в WordPad``е.
#IfWinActive
^!c::MsgBox Вы нажали Control+Alt+C в окне, не являющемся Блокнотом/WordPad``ом.

Если больше чем один вариант имеет право сработать (подпадает под критерии), то сработает только один вариант - самый близкий к началу скрипта. Исключение составляет общий вариант (то есть без #IfWin критериев): он всегда имеет самое низкое старшинство, поэтому он сработает, только если никакой другой вариант не подходит (это исключение не относится к строкам автозамены [hotstrings]).

При назначении вариантов порядок символов-модификаторов, таких как ^!+# не имеет значения. Например, ^!c то же самое, что и !^c.

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

#IfWinActive ahk_class Notepad
#z::
#IfWinActive ahk_class WordPadClass
#z::
MsgBox Вы нажали Win+Z или в Блокноте или в WordPad``е.
return

Для создания вариантов горячей клавиши динамически (в то время как скрипт выполняется), см. "Hotkey IfWin".

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

#IfWin также блокирует префиксную клавишу (в такой горячей клавише, как "a & b", префиксная клавиша - "a"). Это происходит всякий раз, когда нет никаких назначенных горячих клавиш с этим префиксом.

Когда используются Gosub или Goto, чтобы перейти к метке горячей клавиши или строке автозамены, переход осуществляется к самому близкому к началу скрипта варианту.

Если горячая клавиша в настоящее время заблокирована через #IfWin, то эта клавиша или кнопка мыши будет отмечена символом "#" в столбце "Type" в KeyHistory. Это может помочь при отладке скрипта.

Ссылки на переменные вроде %Var% в настоящее время не поддерживаются. Поэтому символ процента нужно экранировать через `%, чтобы позволить в будущем поддерживать такие переменные. Точно так же запятые нужно экранировать (через `,) чтобы позволить в будущем добавить дополнительные параметры.

На метку, на которую команда Hotkey назначила горячую клавишу, директива #IfWin напрямую не действует. Вместо этого используется самая близкая к началу скрипта директива #IfWin (если она есть), которая действует на все горячие клавиши, созданные командой Hotkey (если только для изменения такого поведения не использовалась команда "Hotkey IfWin").

Горячие клавиши, назначаемые для Alt-tab [Alt-tab hotkeys], не зависят от #IfWin, т.к. они действуют для всех окон.

ПоследнееНайденноеОкно [Last Found Window] устанавливается директивой #IfWinActive/Exist (но не #IfWinNotActive/NotExist). Например:

#IfWinExist ahk_class Notepad
#n::WinActivate ; Активация окна, найденного #IfWin.

Escape-последовательности `s и `t могут использоваться, если лидирующие или заключительные пробелы/табы необходимы в параметрах.

По соображениям производительности #IfWin не контролирует непрерывно активность или существование определенных окон. Вместо этого проверяется соответствие окна условиям только тогда, когда вы нажимаете горячую клавишу или строку автозамены. Если окно не соответствующее, то нажатия клавиш или клики мыши направляются активному окну неизменными (исключение - Windows 95/98/Me).

Заголовки окна и текст всегда чувствительны к регистру. Скрытые окна не определяются, если команда DetectHiddenWindows не была включена в автовыполняюшийся раздел (начальная часть скрипта).

В версиях более старых, чем 1.0.42, директива #IfWin была более ограничена:

Примеры

#IfWinActive ahk_class Notepad
^!a::MsgBox Вы нажали Ctrl-Alt-A, когда активно окно Блокнота.
; Эта горячая клавиша не будет иметь никакого эффекта
; если нажата в других окнах (клавиши направятся окну не измененными).
#c::MsgBox Вы нажали Win-C, когда активно окно Блокнота.
::btw::Эта строка автозамены для "btw" сработает только в Блокноте.
#IfWinActive
#c::MsgBox Вы нажали Win-C в окне, отличном от Блокнота.

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

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