1

Тема: AHK: Срабатывание при нажатии определенной комбинации с запоминанием

Всем привет. Есть такие условия:
Идёт набор 13 цифр (меньше секунды) и нажимается Enter.

Что должно получиться:
Если идёт последовательное нажатие 13 цифр + Enter - то нажимается F7 + 13 цифр + Enter.

Подскажите, как это реализовать?
Отслеживать, когда нажимается цифра и если да, то следующая цифра, если да, то .. и так далее?
Или есть более компактный способ?

2

Re: AHK: Срабатывание при нажатии определенной комбинации с запоминанием

Цифры всегда одни и те же?

3 (изменено: jerry33, 2021-09-08 17:06:18)

Re: AHK: Срабатывание при нажатии определенной комбинации с запоминанием

Нет, всегда разные, одинаково только их кол-во и Enter в конце.
(Но интересен вариант и с одной комбинацией. Что-то типа скрытого кода на компьютере. Это лучше в следующих сообщениях обсудить ;-) )
Или вопрос по другому можно поставить:
Как сделать, что бы AHK помнил последние несколько нажатий?
Пример: было 4 нажатия - 1,3,3,2 => AHK их запомнил 1332
Нажимаешь 5 => теперь AHK помнит 3325
Нажимаешь 7 => теперь AHK помнит 3257
И так далее..

Как я это представляю на словах: AHK следит за нажатиями клавиш, если это цифра - записывает в переменную (буфер объемом в Х символов).
Нажимается Enter - если в буфере X цифр, то F7+вывод буфера+Enter
Если нажимается всё остальное - буфер очищается.

4

Re: AHK: Срабатывание при нажатии определенной комбинации с запоминанием

Следить за нажатиями клавиш удобно через InputHook(). Сохранять нажатые клавиши можно в массив в момент нажатия, и удалять из массива в момент отжатия.
Вот пример использования InputHook().

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

5

Re: AHK: Срабатывание при нажатии определенной комбинации с запоминанием

Можно подсказку: где объявлять переменную, что-бы функция имела к ней доступ?
Не понимаю, почему ==ToolTip % Array[1]== в первом случае срабатывает, как и ожидается, а во втором (внутри функции) - ни как...


Array := []
Array.Push(50)
ToolTip % Array[1]
SetTimer, RemoveToolTip, -5000
Hook := InputHook("V")
Hook.KeyOpt("{All}", "N")
Hook.OnKeyDown := Func("OnKeyDown")
Hook.OnKeyUp := Func("OnKeyUp")
Hook.Start()
Return

OnKeyDown(hook, vk, sc) {
   ;ToolTip % "Нажата клавиша: " . GetKeyName( Format("vk{:x}sc{:x}", vk, sc) )
   Array.Push([vk])
   ToolTip % Array[1]
   SetTimer, RemoveToolTip, -5000
}

OnKeyUp(hook, vk, sc) {
   ;ToolTip % "Отпущена клавиша: " . GetKeyName( Format("vk{:x}sc{:x}", vk, sc) )
   ;SetTimer, RemoveToolTip, -2000
}

RemoveToolTip:
ToolTip
return

6

Re: AHK: Срабатывание при нажатии определенной комбинации с запоминанием

А зачем вы vk в квадратные скобки взяли?

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

7 (изменено: jerry33, 2021-09-11 20:13:40)

Re: AHK: Срабатывание при нажатии определенной комбинации с запоминанием

Разобрался! Спасибо.
Исправленный вариант:


global Array := []
Hook := InputHook("V")
Hook.KeyOpt("{All}", "N")
Hook.OnKeyDown := Func("OnKeyDown")
Hook.OnKeyUp := Func("OnKeyUp")
Hook.Start()
Return

OnKeyDown(hook, vk, sc) {
   ;ToolTip % "Нажата клавиша: " . GetKeyName( Format("vk{:x}sc{:x}", vk, sc) )
   ;ToolTip % "Нажата клавиша: " . sc 
   if (vk ~= "48|49|50|51|52|53|54|55|56|57|13"){
      Array.Push(vk)
      while Array.MaxIndex() > 14 { ;Array.Count()
         Array.RemoveAt(1, 1)
      }
      ;if ....  
   }
   Else {
       Array := []
   }
   ToolTip % Array[Array.MaxIndex()] Array.MaxIndex()
   SetTimer, RemoveToolTip, -5000
}

OnKeyUp(hook, vk, sc) {
   ;ToolTip % "Отпущена клавиша: " . GetKeyName( Format("vk{:x}sc{:x}", vk, sc) )
   ;SetTimer, RemoveToolTip, -2000
   ;ToolTip % Array[1]
   ;if (vk = 13){
   ;   Array := []
   ;}
}

RemoveToolTip:
ToolTip
return

Такой вопрос: Как проверить каждый элемент массива на нужное мне условие? (На данный момент только IF знаю, но наверное можно как-то компактнее..)
Условие: Array[14] = 13 всегда, а Array[1-13] = 48 - 57
+++
Даже по другому: Array[14] = 13 всегда, Array[1-13] не ровно 13

8

Re: AHK: Срабатывание при нажатии определенной комбинации с запоминанием

А что значит Array[1-13] ?

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

9 (изменено: jerry33, 2021-09-11 21:02:46)

Re: AHK: Срабатывание при нажатии определенной комбинации с запоминанием

Подскажите, где я ошибся?

global Array := []
Hook := InputHook("V")
Hook.KeyOpt("{All}", "N")
Hook.OnKeyDown := Func("OnKeyDown")
Hook.OnKeyUp := Func("OnKeyUp")
Hook.Start()
Return

OnKeyDown(hook, vk, sc) {
   ;ToolTip % "Нажата клавиша: " . GetKeyName( Format("vk{:x}sc{:x}", vk, sc) )
   ;ToolTip % "Нажата клавиша: " . sc 
   if (vk ~= "48|49|50|51|52|53|54|55|56|57|13"){
      Array.Push(vk)
      while Array.MaxIndex() > 15 { ;Array.Count()
         Array.RemoveAt(1, 1)
      }
      if (Array.MaxIndex() = 14) {
      for index, element in Array
      {
         if (index < 14) && (element < 47 || element > 58) {
            Array = []
         } else if (index = 14) && (element != 13) {
            Array = []
         } else {
            ToolTip % Array[Array.MaxIndex()]
         }
      }
      }
   }
   Else {
       Array = []
   }
   ;ToolTip % Array[Array.MaxIndex()] Array.MaxIndex()
   SetTimer, RemoveToolTip, -5000
}

OnKeyUp(hook, vk, sc) {
   ;ToolTip % "Отпущена клавиша: " . GetKeyName( Format("vk{:x}sc{:x}", vk, sc) )
   ;SetTimer, RemoveToolTip, -2000
   ;ToolTip % Array[1]
   ;if (vk = 13){
   ;   Array := []
   ;}
}

RemoveToolTip:
ToolTip
return

Array[1-13] - это индекс с 1 по 13.

10

Re: AHK: Срабатывание при нажатии определенной комбинации с запоминанием

Опишите словами алгоритм, который пытались реализовать в скрипте.

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

11

Re: AHK: Срабатывание при нажатии определенной комбинации с запоминанием

Когда массив размером 14, то:
-Если в 14 ячейке 13, а в 1 по 13 ячейках от 48, до 57 (включительно): {F7} + перебор всего массива.
-Иначе очистить массив.
"а в 1 по 13 ячейках от 48, до 57 (включительно)" - или в ячейках не число 13

12

Re: AHK: Срабатывание при нажатии определенной комбинации с запоминанием

Во-первых, чтобы присвоить переменной пустой массив, нужно использовать знак :=, а не =, иначе вы присваиваете не массив, а буквальный текст []:

var = []
MsgBox, % var

Во-вторых, массив тут не особо нужен, легче пользоваться простой строкой символов (именно символов, точнее, названий нажатых клавиш, а не их vk), просто добавляя последний в конец. Определить, что в конце строки нужная комбинация (13 цифр + Enter), можно через RegExMatch:

str := "abcd0123456789012Enter"
if RegExMatch(str, "\d{13}Enter$")
   MsgBox, В конце строки 13 цифр и Enter
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder