1

Тема: AHK: Как проверить, нажималась ли другая клавиша между хоткеями?

Есть скрипт, по двойному нажатию заменяющий латинские буквы на турецкие. Например, нажимаю быстро (менее 200 мс между нажатиями) "ss", появляется "ş".  Работает, но проблема в том, что если быстро набираю "sos", то тоже срабатывает замена.  Нужно отловить условие, что между хоткеями нажималась другая клавиша. Пробовал через A_PriorKey, но она почему-то всегда пустая, хотя по KeyHistory в логе есть промежуточные нажатия.

Код интересующей части скрипта такой:

#MaxThreadsPerHotkey 2
#InstallKeybdHook
#KeyHistory 2

$s::
  lang := GetLang()
  if (lang <> "English") {
    send, ы
    return
  }
  OutputDebug, A_PriorKey: %A_PriorKey%
  OutputDebug, A_PriorHotkey: %A_PriorHotkey%
  OutputDebug, A_ThisHotkey: %A_ThisHotkey%
  KeyHistory

  if (A_PriorHotkey <> A_ThisHotkey or A_TimeSincePriorHotkey > 200 or A_PriorHotkey <> A_PriorKey) 
  { 
    send, s
    return 
  }
  send, {BS}ş
return

Добавил условие A_PriorHotkey <> A_PriorKey, чтобы убеждаться, что не было промежуточных нажатий, но из-за того, что A_PriorKey пустое, вообще не заменяет ничего. Почему может не заполняться A_PriorKey?

2 (изменено: stealzy, 2018-09-16 21:28:11)

Re: AHK: Как проверить, нажималась ли другая клавиша между хоткеями?

Можно использовать капслок или клавишу меню в качестве модификатора турецкого языка: http://forum.script-coding.com/viewtopi … 45#p127345.

Что же касается вашего вопроса - "$s" != "s".

#MaxThreadsPerHotkey 2
#InstallKeybdHook

$s::
  ToolTip % A_PriorHotkey " <> " A_ThisHotkey "`n" A_TimeSincePriorHotkey " > 200`n" A_PriorHotkey " <> " A_PriorKey
  if (A_PriorHotkey <> A_ThisHotkey or A_TimeSincePriorHotkey > 200 or A_PriorHotkey <> A_PriorKey)  
    send s
  else
    send ş
return

3

Re: AHK: Как проверить, нажималась ли другая клавиша между хоткеями?

stealzy, о, благодарю, так заработало.

Под $s подправил, но получается A_PriorKey было пустым из-за "#KeyHistory 2". Странно, в доке пишут "For this variable to be of use, the keyboard or mouse hook must be installed and key history must be enabled", вот и добавил.

Клавишу-модификатор рассматривал, двойное нажатие удобнее показалось - не надо пальцы тянуть далеко каждый раз. Но вот оказалось, что редактирование через backspace не со всеми приложениями совместимо, так что посмотрю ещё в сторону модификаторов.

А тултип для отладки - полезная штука, не надо с DebugView возиться. Благодарю за наводку.
Правда, AHK очень эпизодически использую, у меня даже AHK-скрипт через JS-скрипт генерируется - не хотелось долго разбираться со всеми тонкостями эскейпинга, функций для генерации хоткеев и т.д. Язык непривычный всё-таки.

4

Re: AHK: Как проверить, нажималась ли другая клавиша между хоткеями?

dron008 пишет:

получается A_PriorKey было пустым из-за "#KeyHistory 2"

A_PriorKey - The name of the last key which was pressed prior to the most recent key-press or key-release, or blank if no applicable key-press can be found in the key history.

А теперь посмотрите какие нажатия сохраняются в keyhistory при #KeyHistory 2.

5

Re: AHK: Как проверить, нажималась ли другая клавиша между хоткеями?

Malcev пишет:

А теперь посмотрите какие нажатия сохраняются в keyhistory при #KeyHistory 2.

В том-то и дело, что там значения были, выше отмечал это: "...хотя по KeyHistory в логе есть промежуточные нажатия".

6 (изменено: Malcev, 2018-09-17 03:59:06)

Re: AHK: Как проверить, нажималась ли другая клавиша между хоткеями?

#InstallKeybdHook
#KeyHistory 2
KeyHistory

Запустите этот код, наберите 123, нажмите view->refresh.
Что у вас показывает?

7

Re: AHK: Как проверить, нажималась ли другая клавиша между хоткеями?

Malcev пишет:

Запустите этот код, наберите 123, нажмите view->refresh.
Что у вас показывает?

Такое показывает:

VK  SC	Type	Up/Dn	Elapsed	Key		Window
-------------------------------------------------------------------------------------------------------------
33  004	 	d	0.92	3              	
33  004	 	u	0.13	3              	

8

Re: AHK: Как проверить, нажималась ли другая клавиша между хоткеями?

В keyHistory "2" нету, следовательно A_PriorKey пустой.

9

Re: AHK: Как проверить, нажималась ли другая клавиша между хоткеями?

Понятно, буфер нужно больше делать, значит или не ограничивать. Он для одного только хоткея Shift+R 12 строк туда добавляет. Просто в хелпе-то об этом ничего нет.

10

Re: AHK: Как проверить, нажималась ли другая клавиша между хоткеями?

Всё там есть:
https://autohotkey.com/docs/commands/_KeyHistory.htm

11

Re: AHK: Как проверить, нажималась ли другая клавиша между хоткеями?

Malcev, А, точно, спасбо. Смотрел только описание самой команды KeyHistory, куда ссылка с PriorKey вела.