1

Тема: AHK: Двойное нажатие клавиш F1-F12

Уважаемые форумчане.

После экспериментов с двойным нажатием клавиш я пришел к твердому выводу, что для меня наиболее целесообразно чтобы при нажатии клавиш F1-F12 происходили те действия, которые запрограммированы разработчиками разных программ.

А вот после ДВОЙНОГО и ТРОЙНОГО нажатия, я хотел чтобы запускались действия придуманные мною.
У меня к вам просьба:

откорректируйте, пожалуйста, следующий код:

F11:: Gosub, PressCount            ; Запускается счётчик нажатий.

F11(1):                            ; Код для одиночного нажатия F11.
  Send хххххххххх@mail.ru
Return

F11(2):                            ; Код для двойного нажатия F11.
  Send уууууууууу@mail.ru
Return

 
PressCount:
  Pause_=300     ; Если пауза меньше этого количества миллисекунд, то нажатие
                 ; двойное. Если больше, то оно расценивается как 2 одиночных.
  If not Second
  {
    Second=1
    SetTimer, DoublePress, -%Pause_%
  }
  Else
  {
    Second=0
    SetTimer, %A_ThisHotkey%(2), -1
  }
Return

DoublePress:
  If not Second
    Return
  Second=0
  SetTimer, %A_ThisHotkey%(1), -1
Return

таким образом, чтобы при первом нажатии клавиши F11 не происходили действия придуманные мною, а мой основной электронный адрес (хххххххххх@mail.ru) появлялся бы после быстрого ДВОЙНОГО нажатия клавиши F11, и мой резервный электронный адрес (уууууууууу@mail.ru) появлялся бы после быстрого ТРОЙНОГО нажатия клавиши F11. Спасибо

2

Re: AHK: Двойное нажатие клавиш F1-F12

А зачем третий раз тему создавать?

3

Re: AHK: Двойное нажатие клавиш F1-F12

Я начинающий пользователь Autohotkey, и мне пока не понятно каким образом можно добиться использования только ДВОЙНОГО и ТРОЙНОГО нажатия клавиши.

Другими словами, я бы хотел, чтобы обычное (ОДНОКРАТНОЕ) нажатие никак не было бы связано с последующим ДВОЙНЫМ и ТРОЙНЫМ нажатием клавиши.

Я не сомневаюсь, что моя идея хороша, и что ее воплощение с помощью программистов на форуме будет полезно многим.

Фактически, я не создаю тему третий раз я ее просто развиваю.

Если моя аргументация того, что я не начинаю тему третий раз, а развиваю ее Вас не убедила, то позвольте несколько по иному изложить мою идею.

Допустим, человек привык использовать клавиши F1-F12, так как это было запрограммировано разработчиками разных программ. Соответственно скрипт не влияющий на действие производимое после ОДНОКРАТНОГО нажатия клавиш F1-F12 фактически позволяет получить 24 свободных клавиш. То есть быстрое нажатие клавиш F1-F12 позволит их использовать для своих нужд. Естественно, нет ничего удобнее, чем нажимать одну клавишу (пусть и несколько раз), чем использовать комбинацию при которой задействуются, например, клавиши Alt, Ctrl или клавиша Windows. Пожалуйста, дайте "зеленый свет" моему вопросу или подскажите как мне лучше добиться решения этой проблемы.

4

Re: AHK: Двойное нажатие клавиш F1-F12

Тогда прийдется использовать задержку на отправление "оригинальной" клавиши. Тоесть если клавишу нажать 1 раз, нужно будет ждать, не нажмет ли пользователь ее еще раз, и если не нажмет то отправлять нажатие "оригинальной" клавиши. Также нужно подумать, что будет если зажать клавишу, иногда это используется.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

5

Re: AHK: Двойное нажатие клавиш F1-F12

serzh82saratov уже постил код для тройного нажатия. Проще всего его и использовать.
Только поставьте где-нибудь в начале скрипта директиву #UseHook On, т.к. клавиша посылает сама себя при одиночном нажатии и нужно избежать зацикливания.


#UseHook On

F11::
    KeyWait, %A_ThisHotkey%
    KeyWait, %A_ThisHotkey%, D T0.3
    If ErrorLevel
        Send, {F11}
    Else
    {
        KeyWait, %A_ThisHotkey%
        KeyWait, %A_ThisHotkey%, D T0.3
        If ErrorLevel
            Send, xxx@mail.ru
        Else
            Send, yyy@mail.ru
        KeyWait, %A_ThisHotkey%
    }
    Return

6

Re: AHK: Двойное нажатие клавиш F1-F12

Если моя аргументация того, что я не начинаю тему третий раз, а развиваю ее Вас не убедила, то позвольте несколько по иному изложить мою идею.

Как не излагайте, не убедительно.


F11:: 
    KeyWait, %A_ThisHotkey%
    KeyWait, %A_ThisHotkey%, D T0.3
    If ErrorLevel
        SendInput {%A_ThisHotkey%}
    Else
        MsgBox %A_ThisHotkey%
    KeyWait, %A_ThisHotkey%
    Return

Также нужно подумать, что будет если зажать клавишу, иногда это используется.

Да, это тоже удобно.

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

7 (изменено: Maxim, 2014-09-01 13:11:15)

Re: AHK: Двойное нажатие клавиш F1-F12

Здравствуйте, YMP. Я вам очень благодарен. ВСЕ РАБОТАЕТ!

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

Я обещаю больше не беспокоить Вас по этой теме. Честно, я пытался сам дописать скрипт для четырех быстрых нажатий клавиши F11, но не получилось. Надеюсь на ваш ответ, и обязательно начну читать Autohotkey for Dummies.

8

Re: AHK: Двойное нажатие клавиш F1-F12

Maxim Может будет проще так...

1. Одиночное нажатие клавиши
2. Двойное нажатие клавиши
3. Удержание клавиши клавиши

Подпрограмма унифицирована, так что её достаточно описать и вызвать и число таких описаний/блоков не ограничено

Enter::    
  сBaseKey              := "Enter"
  cAloneKey             := "Enter"   ; Действия по Enter
  cDoubleKey            := "Space"   ; Взять всё
  cHoldingKey           := "LButton"
  сPause_PressKey       := 300   
  cWaitHoldingBaseKey   := 1     
  cCountHoldingBaseKey  := 40   
  cWaitVirtualKey       := 5    
  cWaitBaselKey         := 10
  fAutoRepeat           := false
  gosub sbTrioProcessingKeys
return
+ Подпрограммы(набор) - Три действия/клавиши в одной
;==============Подпрограмма - Три действия/клавиши в одной======================
;  сBaseKey              :=         ; Нажимаемая клавиша
;  cAloneKey             :=         ; 1-я Виртуальная клавиша
;  cDoubleKey            :=         ; 2-я Виртуальная клавиша
;  cHoldingKey           :=         ; 3-я Виртуальная клавиша
;--------------Оптимальное значение для игр и мышки на опыте игры "The Witcher 2 - Assassins of Kings"
;  сPause_PressKey       := 350    ; Если пауза меньше этого количества миллисекунд, то нажатие двойное. Если больше, то оно расценивается как 2 одиночных
;  cWaitHoldingBaseKey   := 2      ; Время ожидания в цикле определения удержания за каждый шаг, при больших значениях блокирует одиночное/двойное нажатие.
;  cCountHoldingBaseKey  := 25     ; Число шагов цикла для определения удержание клавиши/кнопки, при больших значениях блокирует одиночное/двойное нажатие.
;  cWaitVirtualKey       := 10     ; Время задержки между эмуляцией нажатия на клавиши/кнопки подмены реально нажатой клавишей/кнопкой.
;  fAutoRepeat           := false  ; Автоповтор реально нажатой клавиши/кнопки - включён/выключен True/False

;------------Начало работы      
#UseHook, On
sbTrioProcessingKeys:
; Требуется реализация блокировки от входа с разных клавиш, т.е. защита от множественного входа на време отработки этой подпрограммы.
  vCountHoldingBaseKey:=cCountHoldingBaseKey
  ;Проверка на удержание нажатия/клика клавиши/кнопки
  while ((GetKeyState(сBaseKey, "P")) && vCountHoldingBaseKey && (!сSecond_PressKey)) 
      {
        sleep %cWaitHoldingBaseKey%   
        vCountHoldingBaseKey--
      }
  if (!vCountHoldingBaseKey)
      { 
  ; Нормальное удержание не работает, нужно не посылать код отжатия, пока нажата реальная клавиша - в подпрограмме sbAutoRepeat треуется корректировка.
  ; Надо сделать режим удерживать или нет клавишу, а это ввод второго флага, может быть для всех трёх клавиш.        
        Send, {%cHoldingKey% Down}  ;Удержание нажатия/клика клавиши/кнопки
        Sleep %cWaitVirtualKey%    
        Send, {%cHoldingKey% Up}
        Gosub sbAutoRepeat
        return
      } 
     else 
        Gosub, sbPressCountKeys
return            ; Конец обработки подпрограммы sbStartProcessingKeys


;Одиночное нажатие/клик клавиши/кнопки
sbAloneKey:
  Send, {%cAloneKey% Down}
  Sleep %cWaitVirtualKey%    
  Send, {%cAloneKey% Up}
  Gosub sbAutoRepeat
Return

;Двойное нажатие/клик клавиши/кнопки
sbDoubleKey:
  Send, {%cDoubleKey% Down}
  Sleep %cWaitVirtualKey%    
  Send, {%cDoubleKey% Up}  
  Gosub sbAutoRepeat
Return

;Без/С автоповтором основной клавиши/кнопки
sbAutoRepeat:
  if (!fAutoRepeat)
      {
        Send, {%сBaseKey% Down}   ; Без автоповтора
        ;while (GetKeyState(сBaseKey, "P"))
        KeyWait, %сBaseKey%  ;Sleep %cWaitBaselKey% 
        Send, {%сBaseKey% Up}      
      }
Return                            ; C автоповтором

#UseHook, Off

sbPressCountKeys:
  If not сSecond_PressKey
      {
        сSecond_PressKey := 1
        SetTimer, sbDoublePressKey, -%сPause_PressKey%
      }
    Else
      {
        сSecond_PressKey := 0
        SetTimer, sbDoubleKey, -1
      }
Return

sbDoublePressKey:
  If not сSecond_PressKey
        Return
  сSecond_PressKey := 0
  SetTimer, sbAloneKey, -1
Return
;-----------------------------------------------------------------

P.S.  Более двух нажатий это перебор IMHO - хотя и это можно реализовать.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

9

Re: AHK: Двойное нажатие клавиш F1-F12

Вот вариант для 4 нажатий.


#UseHook On

F11::
    KeyWait, %A_ThisHotkey%
    KeyWait, %A_ThisHotkey%, D T0.3
    If ErrorLevel
        Send, {%A_ThisHotkey%}      ; 1 нажатие, сама клавиша.
    Else
    {
        KeyWait, %A_ThisHotkey%
        KeyWait, %A_ThisHotkey%, D T0.3
        If ErrorLevel
            Send, xxx@mail.ru       ; 2 нажатия.
        Else
        {
            KeyWait, %A_ThisHotkey%
            KeyWait, %A_ThisHotkey%, D T0.3
            If ErrorLevel
                Send, yyy@mail.ru   ; 3 нажатия.
            Else
                Send, zzz@mail.ru   ; 4 нажатия.
        }
    }
    Return

10

Re: AHK: Двойное нажатие клавиш F1-F12

Спасибо, YMP!

Спасибо, Indomito, что подбросили идею о возможности использования удержания клавиши.

11 (изменено: Irbis, 2014-09-01 20:10:19)

Re: AHK: Двойное нажатие клавиш F1-F12

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

#UseHook On

F10::
F11::
F12::
N:=0
Loop {
   N++
   KeyWait, %A_ThisHotkey%
   KeyWait, %A_ThisHotkey%, D T0.3
} Until ErrorLevel
If N=1
   Send, {%A_ThisHotkey%}
Else
   Gosub % IsLabel(L := A_ThisHotkey . "_" . N) ? L : "NotCombo"
Return

NotCombo:
   MsgBox % "Количество нажатий " . A_ThisHotkey . " : " . N
Return

F11_2:
   SendInput, xxx@mail.ru
Return

F11_3:
   SendInput, yyy@mail.ru
Return

12

Re: AHK: Двойное нажатие клавиш F1-F12

Отличная идея. Получается бесконечное количество возможных действий на функциональные клавиши.

13

Re: AHK: Двойное нажатие клавиш F1-F12

Мне кажется это перебор, с учётом того что сейчас множество клавиатур программируемые. Обычно/Как правило это язык LUA.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

14

Re: AHK: Двойное нажатие клавиш F1-F12

А какое это имеет значение?

15

Re: AHK: Двойное нажатие клавиш F1-F12

serzh82saratov уже постил код для тройного нажатия. Проще всего его и использовать.
Только поставьте где-нибудь в начале скрипта директиву #UseHook On, т.к. клавиша посылает сама себя при одиночном нажатии и нужно избежать зацикливания.

В тестовом скрипте #UseHook по дефолту, всё время забываю.

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

16 (изменено: dm.tr.y, 2016-07-22 22:17:10)

Re: AHK: Двойное нажатие клавиш F1-F12

Indomito пишет:

Maxim Может будет проще так...

1. Одиночное нажатие клавиши
2. Двойное нажатие клавиши
3. Удержание клавиши клавиши

Подпрограмма унифицирована, так что её достаточно описать и вызвать и число таких описаний/блоков не ограничено

Enter::    
  сBaseKey              := "Enter"
  cAloneKey             := "Enter"   ; Действия по Enter
  cDoubleKey            := "Space"   ; Взять всё
  cHoldingKey           := "LButton"
  сPause_PressKey       := 300   
  cWaitHoldingBaseKey   := 1     
  cCountHoldingBaseKey  := 40   
  cWaitVirtualKey       := 5    
  cWaitBaselKey         := 10
  fAutoRepeat           := false
  gosub sbTrioProcessingKeys
return
+ Подпрограммы(набор) - Три действия/клавиши в одной
;==============Подпрограмма - Три действия/клавиши в одной======================
;  сBaseKey              :=         ; Нажимаемая клавиша
;  cAloneKey             :=         ; 1-я Виртуальная клавиша
;  cDoubleKey            :=         ; 2-я Виртуальная клавиша
;  cHoldingKey           :=         ; 3-я Виртуальная клавиша
;--------------Оптимальное значение для игр и мышки на опыте игры "The Witcher 2 - Assassins of Kings"
;  сPause_PressKey       := 350    ; Если пауза меньше этого количества миллисекунд, то нажатие двойное. Если больше, то оно расценивается как 2 одиночных
;  cWaitHoldingBaseKey   := 2      ; Время ожидания в цикле определения удержания за каждый шаг, при больших значениях блокирует одиночное/двойное нажатие.
;  cCountHoldingBaseKey  := 25     ; Число шагов цикла для определения удержание клавиши/кнопки, при больших значениях блокирует одиночное/двойное нажатие.
;  cWaitVirtualKey       := 10     ; Время задержки между эмуляцией нажатия на клавиши/кнопки подмены реально нажатой клавишей/кнопкой.
;  fAutoRepeat           := false  ; Автоповтор реально нажатой клавиши/кнопки - включён/выключен True/False

;------------Начало работы      
#UseHook, On
sbTrioProcessingKeys:
; Требуется реализация блокировки от входа с разных клавиш, т.е. защита от множественного входа на време отработки этой подпрограммы.
  vCountHoldingBaseKey:=cCountHoldingBaseKey
  ;Проверка на удержание нажатия/клика клавиши/кнопки
  while ((GetKeyState(сBaseKey, "P")) && vCountHoldingBaseKey && (!сSecond_PressKey)) 
      {
        sleep %cWaitHoldingBaseKey%   
        vCountHoldingBaseKey--
      }
  if (!vCountHoldingBaseKey)
      { 
  ; Нормальное удержание не работает, нужно не посылать код отжатия, пока нажата реальная клавиша - в подпрограмме sbAutoRepeat треуется корректировка.
  ; Надо сделать режим удерживать или нет клавишу, а это ввод второго флага, может быть для всех трёх клавиш.        
        Send, {%cHoldingKey% Down}  ;Удержание нажатия/клика клавиши/кнопки
        Sleep %cWaitVirtualKey%    
        Send, {%cHoldingKey% Up}
        Gosub sbAutoRepeat
        return
      } 
     else 
        Gosub, sbPressCountKeys
return            ; Конец обработки подпрограммы sbStartProcessingKeys


;Одиночное нажатие/клик клавиши/кнопки
sbAloneKey:
  Send, {%cAloneKey% Down}
  Sleep %cWaitVirtualKey%    
  Send, {%cAloneKey% Up}
  Gosub sbAutoRepeat
Return

;Двойное нажатие/клик клавиши/кнопки
sbDoubleKey:
  Send, {%cDoubleKey% Down}
  Sleep %cWaitVirtualKey%    
  Send, {%cDoubleKey% Up}  
  Gosub sbAutoRepeat
Return

;Без/С автоповтором основной клавиши/кнопки
sbAutoRepeat:
  if (!fAutoRepeat)
      {
        Send, {%сBaseKey% Down}   ; Без автоповтора
        ;while (GetKeyState(сBaseKey, "P"))
        KeyWait, %сBaseKey%  ;Sleep %cWaitBaselKey% 
        Send, {%сBaseKey% Up}      
      }
Return                            ; C автоповтором

#UseHook, Off

sbPressCountKeys:
  If not сSecond_PressKey
      {
        сSecond_PressKey := 1
        SetTimer, sbDoublePressKey, -%сPause_PressKey%
      }
    Else
      {
        сSecond_PressKey := 0
        SetTimer, sbDoubleKey, -1
      }
Return

sbDoublePressKey:
  If not сSecond_PressKey
        Return
  сSecond_PressKey := 0
  SetTimer, sbAloneKey, -1
Return
;-----------------------------------------------------------------

P.S.  Более двух нажатий это перебор IMHO - хотя и это можно реализовать.

Подскажите: как этот скрипт подправить чтобы 3-им пунктом при зажатии клавиши зажималась другая клавиша
не могу разобраться в скрипте

17

Re: AHK: Двойное нажатие клавиш F1-F12

dm.tr.y пишет:

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

Не понял, так при зажатии Enter происходит зажатие LButton.

Enter::    
  сBaseKey              := "Enter"
  cAloneKey             := "Enter"   ; Одиночное нажатие
  cDoubleKey            := "Space"   ; Двойное нажатие
  cHoldingKey           := "LButton" ; Удержание/Зажатие
  сPause_PressKey       := 300   
  cWaitHoldingBaseKey   := 1     
  cCountHoldingBaseKey  := 40   
  cWaitVirtualKey       := 5    
  cWaitBaselKey         := 10
  fAutoRepeat           := false
  gosub sbTrioProcessingKeys
return

Ясно?

P.S. Я перепроверю код, я внёс проварки - не публиковал их, т.к. им ни кто не интересовался.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

18 (изменено: Indomito, 2016-07-27 08:57:29)

Re: AHK: Двойное нажатие клавиш F1-F12

dm.tr.y
Вот посмотри этот код, тут были внесены изменения и коррекция.

Enter::
  сBaseKey              := "Enter"
  cAloneKey             := "1"  ;одиночное нежатие клавиши
  cDoubleKey            := "2"  ;двойное нажатие клавиши
  cHoldingKey           := "3"  ;удержание клавиши
 ;Активация констант для скорости реакции нажатий  для остального
  сPause_PressKey       := 400   
  cWaitHoldingBaseKey   := 1     
  cCountHoldingBaseKey  := 80   
  cWaitVirtualKey       := 5    
  cWaitBaselKey         := 10
  fAutoRepeat           := False       ; Автоповтор основной клавиши         = деактивирован
  fAloneHoldKey         := False       ; Модификатор для одиночного нажатия  = деактивирован
  fDoubleHoldKey        := False       ; Модификатор для двойного нажатия    = деактивирован
  fHoldingHoldKey       := False       ; Модификатор для удержания           = деактивирован
  gosub sbTrioProcessingKeys
Return
+ открыть спойлер
Enter::
  сBaseKey              := "Enter"
  cAloneKey             := "1"  ;одиночное нежатие клавиши
  cDoubleKey            := "2"  ;двойное нажатие клавиши
  cHoldingKey           := "3"  ;удержание клавиши
 ;Активация констант для скорости реакции нажатий  для остального
  сPause_PressKey       := 400   
  cWaitHoldingBaseKey   := 1     
  cCountHoldingBaseKey  := 80   
  cWaitVirtualKey       := 5    
  cWaitBaselKey         := 10
  fAutoRepeat           := False       ; Автоповтор основной клавиши         = деактивирован
  fAloneHoldKey         := False       ; Модификатор для одиночного нажатия  = деактивирован
  fDoubleHoldKey        := False       ; Модификатор для двойного нажатия    = деактивирован
  fHoldingHoldKey       := False       ; Модификатор для удержания           = деактивирован
  gosub sbTrioProcessingKeys
Return

/*
==============Подпрограмма - Три действия/клавиши в одной======================
сBaseKey          :=  Автозадание через "A_ThisHotkey", возможно переназначение, но не рекомендуются, возможны коллизии
cAloneKey         :=  ;1-я Виртуальная клавиша, по умолчанию задаётся переменной "сBaseKey"
cAloneHoldKey     :=  ;Клавиша-модификатор для одиночного нажатия, основная и клавиша-модификатор
cDoubleKey        :=  ;2-я Виртуальная клавиша, по умолчанию задаётся переменной "сBaseKey"
cDoubleHoldKey    :=  ;Клавиша-модификатор для двойного нажатия, основная и клавиша-модификатор
cHoldingKey       :=  ;3-я Виртуальная клавиша, по умолчанию задаётся переменной "сBaseKey". Клавишиа удерживается(автоповтор)
cHoldingHoldKey   :=  ;Модификатор удержания, основная и клавиша-модификатор
Gosub sbIniTrioParams - вызов подпрограммы для задания констант для скорости реакции по обработке нажатий

ВАЖНО!!! - Задание клавиш-модификаторов не обязательно, при условии, если их флаги в состоянии FALSE

--------------------------------------------------------------
Описание констант для скорости реакции по обработке нажатий
-------------------------------------------------------------
сPause_PressKey  
          Если пауза меньше этого количества миллисекунд, то нажатие двойное. Если больше, то оно расценивается как 2 одиночных
cWaitHoldingBaseKey    
          Время ожидания в цикле определения удержания за каждый шаг, при больших значениях блокирует одиночное/двойное нажатие.
cCountHoldingBaseKey  
          Число шагов цикла для определения удержание клавиши/кнопки, при больших значениях блокирует одиночное/двойное нажатие.
cWaitVirtualKey
          Время задержки между эмуляцией нажатия на клавиши/кнопки подмены реально нажатой клавишей/кнопкой.
cWaitBaselKey 
          Время для Без/С автоповтором основной клавиши/кнопки
fAutoRepeat
          Автоповтор реально нажатой клавиши/кнопки - включён/выключен True/False
fAloneHoldKey
          Флаг(On/Off) для работы модификатора одиночного нажатия
fDoubleHoldKey
          Флаг(On/Off) для работы модификатора двойного нажатия
fHoldingHoldKey
          Флаг(On/Off) для работы модификатора удержания 
          
;-------Оптимальное значение, рекомендуемые, на основе игр - "The Witcher 2: Assassins of Kings" и "The Witcher 3: Wild Hunt"
Значения 
  сPause_PressKey       := 325  
  cWaitHoldingBaseKey   := 1     
  cCountHoldingBaseKey  := 40   
  cWaitVirtualKey       := 5    
  cWaitBaselKey         := 10
  fAutoRepeat           := False   Автоповтор основной клавиши         = деактивирован (при активации требуется описать, см выше)
  fAloneHoldKey         := False   Модификатор для одиночного нажатия  = деактивирован (при активации требуется описать, см выше)
  fDoubleHoldKey        := False   Модификатор для двойного нажатия    = деактивирован (при активации требуется описать, см выше)  
  fHoldingHoldKey       := False   Модификатор для удержания           = деактивирован (при активации требуется описать, см выше)  
*/

;------------Начало работы      
#UseHook, On
sbTrioProcessingKeys:
  vCountHoldingBaseKey:=cCountHoldingBaseKey
  ;Проверка на удержание нажатия/клика клавиши/кнопки
  while ((GetKeyState(сBaseKey, "P")) && vCountHoldingBaseKey && (!сSecond_PressKey)) 
      {
        Sleep  %cWaitHoldingBaseKey%   
        vCountHoldingBaseKey--
      }
  if (!vCountHoldingBaseKey)
      { 
       If (fHoldingHoldKey)
           Send, {%cHoldingHoldKey% Down}
       Send, {%cHoldingKey% Down}  ;Удержание нажатия/клика клавиши/кнопки
        while (GetKeyState(сBaseKey, "P"))
                 {
                   Sleep %cWaitVirtualKey%    
                 }
         Send, {%cHoldingKey% Up}
       If (fHoldingHoldKey)
           Send, {%cHoldingHoldKey% Up}         
        Gosub sbAutoRepeat
        return
      } 
     else 
        Gosub, sbPressCountKeys
return            ; Конец обработки подпрограммы sbStartProcessingKeys


;Одиночное нажатие/клик клавиши/кнопки
sbAloneKey:
  If (fAloneHoldKey)
        {
            Send, {%cAloneKey% Down}
            Send, {%cAloneHoldKey% Down}
            Sleep %cWaitVirtualKey%
            Send, {%cAloneHoldKey% Up}
            Send, {%cAloneKey% Up}  
        }
      Else 
      {
            Send, {%cAloneKey% Down}
            Sleep %cWaitVirtualKey%    
            Send, {%cAloneKey% Up}      
      }
  Gosub sbAutoRepeat
Return

;Двойное нажатие/клик клавиши/кнопки
sbDoubleKey:
  If (fDoubleHoldKey)
        {
            Send, {%cDoubleKey% Down}
            Send, {%cDoubleHoldKey% Down}
            Sleep %cWaitVirtualKey%
            Send, {%cDoubleHoldKey% Up}
            Send, {%cDoubleKey% Up}
        }
      Else  
      {
            Send, {%cDoubleKey% Down}
            Sleep %cWaitVirtualKey%    
            Send, {%cDoubleKey% Up}        
      }
  Gosub sbAutoRepeat
Return

;Без/С автоповтором основной клавиши/кнопки
sbAutoRepeat:
  if (fAutoRepeat) ; Автоповтор основной клавиши
      {
        Send, {%сBaseKey% Down}
        Sleep %cWaitVirtualKey%
        Send, {%сBaseKey% Up}      
      }
Return

sbPressCountKeys:
  If not сSecond_PressKey
      {
        сSecond_PressKey := 1
        SetTimer, sbDoublePressKey, -%сPause_PressKey%
      }
    Else
      {
        сSecond_PressKey := 0
        SetTimer, sbDoubleKey, -1
      }
Return

sbDoublePressKey:
  If not сSecond_PressKey
        Return
  сSecond_PressKey := 0
  SetTimer, sbAloneKey, -1
Return
;-----------------------------------------------------------------
#UseHook, Off

Или ты хочешь реализацию зажатия условно-бесконечную, т.е. до отжатия основной клавиши - сBaseKey?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

19

Re: AHK: Двойное нажатие клавиш F1-F12

dm.tr.y

Да, скрипт работает немного косо в области удержания  - исправлю опубликую тут в теме.

Приношу свои извинения, за недочёт.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

20 (изменено: dm.tr.y, 2023-03-31 15:16:18)

Re: AHK: Двойное нажатие клавиш F1-F12

YMP пишет:

serzh82saratov уже постил код для тройного нажатия. Проще всего его и использовать.
Только поставьте где-нибудь в начале скрипта директиву #UseHook On, т.к. клавиша посылает сама себя при одиночном нажатии и нужно избежать зацикливания.


#UseHook On

F11::
    KeyWait, %A_ThisHotkey%
    KeyWait, %A_ThisHotkey%, D T0.3
    If ErrorLevel
        Send, {F11}
    Else
    {
        KeyWait, %A_ThisHotkey%
        KeyWait, %A_ThisHotkey%, D T0.3
        If ErrorLevel
            Send, xxx@mail.ru
        Else
            Send, yyy@mail.ru
        KeyWait, %A_ThisHotkey%
    }
    Return

Посдкажите: как исправить этот скрипт чтобы работал на AutoHotkey 2?

21

Re: AHK: Двойное нажатие клавиш F1-F12

dm.tr.y, ознакомьтесь, пожалуйста, с Правилами, отредактируйте свои посты. Обратите внимание на правила цитирования.

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

22

Re: AHK: Двойное нажатие клавиш F1-F12

dm.tr.y, если вопрос ко мне, то увы, в АНК 2 я ни уха, ни рыла. Никогда его не использовал.