1 (изменено: teadrinker, 2017-02-27 16:10:40)

Тема: AutoHotkey для чайников!

Почему не работает моя горячая клавиша?

q::MsgBox, Работает!
й::MsgBox, Работает!

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

Error: Invalid hotkey.

Восприятие скриптом горячих клавиш может зависеть от раскладки (ru-en) активного окна в данный момент, а также от раскладки по умолчанию. Чтобы обойти эту проблему при использовании клавиш, значение которых меняется в зависимости от раскладки, нужно вместо буквенного обозначения писать их виртуальные коды или скан-коды:

vk51::MsgBox, Работает в любой раскладке!   ; vk51 — виртуальный код клавиши Q-Й в шестнадцатеричном формате
sc11::MsgBox, Работает в любой раскладке!   ; sc10 — скан-код клавиши W-Ц в шестнадцатеричном формате

Для определения виртуальных и скан-кодов можно воспользоваться соответствующими таблицами, командой KeyHistory, а также этой программкой.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

2 (изменено: serzh82saratov, 2015-07-19 19:07:33)

Re: AutoHotkey для чайников!

Запись клавиш и их виртуальные коды.
В дополнение к первому посту.
Запись горячей клавиши с помощью виртуального кода имеет смысл только если эта клавиша "буквенно-символьная" (назовём их - КБС), то есть тех которые при печати посылают разные символы, зависящие от текущего языка ввода активного окна. Остальные клавиши имеют свои имена, записывать их через виртуальный код не имеет смысла, и вносит излишние "непонятки" в код.

Использование виртуальных кодов в команде Send.
Например есть цель по клавише F12 нажать "Ctrl+A" (выделение всего текста, "а" - латинская) в активном окне.

F12::Send ^{a}

Если в момент нажатия F12 в окне английский язык ввода, то текст выделится (целевое назначение комбинации сработает), а вот если язык ввода будет например русский, то просто напечатается латинская  "а". Чтобы такого не случилось, и результат нажатия не зависел от языка ввода, КБС необходимо указать через виртуальный код.

F12::Send ^{vk41}    ;  "A"

Для получения виртуального кода или имени клавиши, определения его необходимости (КБС определяются как виртуальный код, остальные пишутся по имени), и получения имени клавиши из виртуального кода, можно воспользоватся AhkSpy.

П.С. Добавляя виртуальный код в свой скрипт, не забывайте в комментарии указывать что он значит, особенно когда его постите на форуме.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3

Re: AutoHotkey для чайников!

Имитация физического зажатия клавиши


Send {vk41}         ; нажатие и отпускание клавиши "a"
Send {vk41 Down}    ; нажатие клавиши "a"
Send {vk41 Up}      ; отпускание клавиши "a"

При физическом «зажатии» клавиши начинает генерироваться «автоповтор нажатий», некоторые программы, для использования в которых вы вероятно и пишете свой скрипт, воспринимают зажатие именно как непрерывную последовательность нажатий.

Например, при нажатии пробела «зажать» клавишу A(Ф), при следующем нажатии пробела — «отпустить»:

Space::
    If isKeyPressed := !isKeyPressed    ; Позволяет чередовать действия при нажатии пробела . При каждой проверке этого условия в переменную isKeyPressed записывается значение обратное её текущему значению.
        SetTimer, SendA, 40             ; Таймер позволяет отправлять нажатия каждые 40мс и не мешает скрипту в паузах «параллельно» выполнять прочие подпрограммы.
    Else
    {
        SetTimer, SendA, Off            ; Если это второе нажатие пробела — выключаем таймер
        Send {vk41 Up}                  ; Чтоб не возникло «залипание» отправляем отпускание клавиши.
    }
    KeyWait Space                       ; ждём физического отпускания пробела чтоб не перезапускать таймер при каждом нажатии пробела во время автоповтора нажатий пробела.
    return

SendA:
    Send {vk41 Down}
    return

4

Re: AutoHotkey для чайников!

Как записать выражение в параметр команды, требующий строчного значения?
Для примера возьмём команду Send. Предположим, нам нужно отправить в активное окно цифру. Всё просто:

Send 5

А если цифра находится в переменной? Тогда можно так:

Var := 5
Send %Var%

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

Var1 := 5
Var2 := 10
Send %Var1% + %Var2%

Тем более, что "+" в данном случае будет интерпретироваться командой, как "Shift".
Так тоже не выйдет:

Var1 := 5
Var2 := 10
SendRaw %Var1% + %Var2%

Теперь посылается просто строка "5 + 10", а не сумма. Как же быть? Есть два варианта. Первый, более длинный — сначала отдельно вычислить результат выражения, сохранить его в переменной, и тогда уже отправлять, как в примере выше:

Var1 := 5
Var2 := 10
Var3 := Var1 + Var2
Send %Var3%

Но есть более "продвинутый" способ — если в начале параметра команды первым символом поставить знак процента с пробелом за ним, то дальше можно писать выражение любой длины и сложности, а в параметр будет записан его результат:

Var1 := 5
Var2 := 10
Send % Var1 + Var2

Переменные в таком случае пишутся без обрамления в знаки процента.

Иногда в описании параметров команд специально оговаривается, что параметр может быть выражением. Например, MouseMove:

MouseMove, X, Y [, Speed, R]

X, Y
    The x/y coordinates to move the mouse to, which can be expressions.

В таком случае для записи выражения предварять его знаком процента с пробелом не нужно:

Var1 := 400
Var2 := 200
CoordMode, Mouse, Screen
MouseMove, Var1 + Var2, Var1 - Var2
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: mozers, 2017-03-26 21:09:46)

Re: AutoHotkey для чайников!

Почему оператор присвоения = не работает так как в других языках?

Оператор присвоения, в других языках программирования выглядящий как = , в AutoHotkey записывается как :=.
Оператор = так же существует, но его использование ограничено рядом правил и условностей. Крайне не рекомендуется использовать в своих скриптах оператор = до тщательного изучения особенностей работы с ним. Тем более что почти не существует случаев когда без применения оператора = нельзя обойтись.
Речь шла о = как операторе присвоения. Как оператор сравнения = используется наряду с другими (<, >, >=, <= и т.п.) самым привычным образом.

6

Re: AutoHotkey для чайников!

Как использовать циклы вместо Goto.

Многие начинающие кодеры с целью зациклить какой-либо набор действий применяют оператор Goto. Использование циклов в этом случае сделает ваш код более компактным и удобочитаемым.
Пример бесконечного цикла.
С Goto:

i := 0
Label:
   i++   ; увеличиваем i на единицу
   ToolTip % i
   Sleep, 300
   goto Label

То же самое с Loop:

Loop  {
   ToolTip % A_Index
   Sleep, 300
}

Здесь роль переменной-счётчика i играет встроенная переменная A_Index, которая автоматически увеличивается с каждой итерацией на единицу. Принципиальное отличие в том, что A_Index имеет смысл и доступна только внутри своего цикла, а переменную i можно изменить извне, что может привести к ошибке, если мы случайно используем эту же переменную где-то в другом месте.

Пример выхода из цикла по условию.
С Goto:

i := 0
Label1:
   i++
   ToolTip % i
   Sleep, 300
   if (i = 10)
      goto Label2
   goto Label1

Label2:
   ToolTip
   MsgBox, Завершено!
   return

To же самое с Loop:

Loop  {
   ToolTip % A_Index
   Sleep, 300
   if (A_Index = 10)
      break
}

MsgBox, Завершено!
return

Или проще:

Loop 10  {
   ToolTip % A_Index
   Sleep, 300
}

ToolTip
MsgBox, Завершено!
return

Ещё аналогичный пример с until:

Loop  {
   ToolTip % A_Index
   Sleep, 300
} until A_Index = 10

ToolTip
MsgBox, Завершено!
return

А следующий пример будет работать по-другому:

while A_Index < 10  {
   ToolTip % A_Index
   Sleep, 300
}

ToolTip
MsgBox, Завершено!
return

Здесь проверка условия идёт в начале цикла, если условие не выполняется, следующая итерация отменяется и цикл прерывается.

Применение цикла для посыла клавиш:

Space::
   while GetKeyState("Space", "P")  {
      SendInput, f
      Sleep, 300
   }
   return

Пока удерживается пробел, будет выполняться условие GetKeyState("Space", "P") и будет посылаться f. Как только пробел будет отпущен, условие перестанет выполняться, и цикл завершится.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AutoHotkey для чайников!

AutoHotkey: в помощь начинающему изучать GUI