Есть ли способ сделать DoubleClick комбинацию клавиш для запуска части кода Ahk.

Вы можете сделать DoubleClick на любой мыши или сенсорном устройстве.

Но мне нравится делать DoubleClick для всех моих комбинаций клавиш.

Я работаю в системе Windows, и мне нравятся языки Autohotkey.

Это код, который у меня есть, хорошие идеи всегда приветствуются.

#SingleInstance force

esc::exitapp

;[Click one Time] - <Ctrl & c> to <copy the text to Clipboard>
{Ctrl}c:: ;Part1 Code.
sendinput ^c
return

;[Double Click] - <Ctrl & (2x)c>  <copy the text to Clipboard> + <do a Doogle Search>
{Ctrl}cc:: ;Part2 Code.
sendinput ^c
sleep 150
run https://www.google.com/?q=%clipboard%
return

;[a Count of Clicks] <Ctrl & (3x)c>
{Ctrl}ccc:: ;Part3 Code.
;?
return

Примечание. Горячая строка <:*:{Ctrl} cv::> и Горячая клавиша <{Ctrl} ccc::> не работают.

2 ответа2

1

Вы можете использовать в своей системе Windows, DoubleClicks или MultiClicks для всех комбинаций нажатий клавиш для запуска любой части кодов Ahk (Hotkeys cc::) - и если вы хотите использовать ее также для (HotkeyStrings:*:cv::) you может поменять скрипт немного.

С этими двумя сценариями AutoHotkey вы можете сделать это.

  • 1. Автоматически ли копирует все комбинации клавиш в один ключ реестра Windows? (вы можете запустить это в фоновом режиме)

Отображение нажатий клавиш на экране из раздела реестра Windows

  • 2: Затем вы можете использовать только это строковое значение из этого ключа реестра и написать кодировки для выполнения чего-либо. (Примечание. Этот простой пример сценария покажет все ваши движения клавиатуры и мыши на экране - и вы можете проверить это с помощью DoubleClick клавиш Ctrl+(2x)c или MultiClicks 3x)

HKEY_CURRENT_USER,software\GetKeypressValue,KeypressValue

DoubleClicks > if(KeypressValue="Ctrl + c, c") или

MultiClicks > if(KeypressValue="Ctrl + c (3)")

показывать нажатия клавиш на экране

2 - Вы даже можете писать сценарии с других языков. (Вам нужен только доступ к этому Единому ключу реестра.)

  • Microsoft Visual Studio
  • Visual Basic
  • Турбо Паскаль
  • Delphi Languages
  • C++

  • Python Languages

2 - DoubleClickForAllKeystrokes.ahk

; [^ = Ctrl] [! = Alt] [+ = Shift] [# = Win]
; Press <esc> key to exit
; Press <f1> key to toggle between [Scan Pause] & [Scan] 
#SingleInstance force
Gui, +AlwaysOnTop -MaximizeBox ; 
Gui, Add, Text, center y10 h50 w300 vVar,  %KeypressValue%
Gui, Color, White
Gui, show
size=20
Gui, Font, s%size%
GuiControl, Font, var
Doloop=1

MainLanguages=us ; United States
TransLationTo=nl ; Dutch

GroupAdd, Browser, ahk_class Chrome_WidgetWin_1 ; Chrome or Iron
GroupAdd, Browser, ahk_class IEFrame            ; Internet Explorer
GroupAdd, Browser, ahk_class MozillaWindowClass ; FireFox
GroupAdd, Browser, ahk_class ApplicationFrameWindow ; Edge

While Doloop=1
{
RegRead, KeypressValue, HKEY_CURRENT_USER,software\GetKeypressValue,KeypressValue ; read KeypressValue


If not GetKeyState("Ctrl","P") and not GetKeyState("Alt","P") and not GetKeyState("LWin","P") and not GetKeyState("RWin","P")
{

;Note - All these Keystrokes will be execute after Release All the keys! 

;OneClick {Ctrl}+1x(c) - Copy Is the Default
;if (KeypressValue="Ctrl + c") ;use this for [1x=Ctrl + c][2x=Ctrl + c, c][3x=Ctrl + c (3)] [and many more]
;{
; Here you can put any Code. (Part 1)
; WriteReg_KeypressValue("OneClick - Is the Default Not Needed")
;}

;DoubleClick {Ctrl}+2x(c) - Copy + Google Search
if (KeypressValue="Ctrl + c, c") ;use this for [1x=Ctrl + c][2x=Ctrl + c, c][3x=Ctrl + c (3)] [and many more]
{
;Here you can put any Code. (Part 2)
;sendinput ^c ;Not needed comes from default. (OneClick)
WriteReg_KeypressValue("2x-Google Search")
If WinActive("ahk_group Browser")
{
sendinput ^c ;copy the selected text to clipboard memory
sleep 150
sendinput ^t ; CTRL+t make a new tab + goto address bar  - use CTRL+L for the active tab + goto address bar
sleep 150
texta = https://www.google.com/search?q=
textb = %clipboard% ;selected text
textc = &lr=lang_%MainLanguages%&hl=%MainLanguages%&num=100 ; google parameters

clipboard=%texta%%textb%%textc%
sleep 150
sendinput ^v ; paste the selected text 
sleep 250
send {enter}
clipboard=%textb%
} else {
sendinput ^c ;copy the selected text to clipboard memory
sleep 150
texta = https://www.google.com/?gfe_rd=cr&gws_rd=cr#q=
textb = %clipboard% ;selected text
textc = &lr=lang_%MainLanguages%&hl=%MainLanguages%&num=100 ; google parameters

clipboard=%texta%%textb%%textc%
run %clipboard%
clipboard=%textb%
}
}

;TripleClicks {Ctrl}+3x(c) - Copy + WikiPedia Search
if (KeypressValue="Ctrl + c (3)") ;use this for [1x=Ctrl c][2x=Ctrl c, c][3x=Ctrl c (3)] [and many more]
{
;Here you can put the Code For (Part 3)
;sendinput ^c ;Not needed comes from default. (OneClick)
WriteReg_KeypressValue("3x-Wiki Search")
If WinActive("ahk_group Browser")
{
sendinput ^c ;copy the selected text to clipboard memory
sleep 150
sendinput ^t ; CTRL+t make a new tab + goto address bar  - use CTRL+L for the active tab + goto address bar
sleep 150
texta = https://en.wikipedia.org/wiki/
textb = %clipboard% ;selected text

clipboard=%texta%%textb%
sleep 150
sendinput ^v ; paste the selected text 
sleep 250
sendinput {enter}
clipboard=%textb%
} else {
sendinput ^c ;copy the selected text to clipboard memory
sleep 150
texta = https://en.wikipedia.org/wiki/
textb = %clipboard% ;selected text

clipboard=%texta%%textb%
run %clipboard%
clipboard=%textb%
}

}

;MultiClicks {Ctrl}+4x(c) - Copy + Translate Text
if (KeypressValue="Ctrl + c (4)") ;use this for [1x=Ctrl c][2x=Ctrl c, c][3x=Ctrl c (4)] [and many more]
{
;Here you can put the Code For (Part 4)
;sendinput ^c ;Not needed comes from default. (OneClick)
WriteReg_KeypressValue("4x-TransLate Text")
If WinActive("ahk_group Browser")
{
sendinput ^c 
sleep 150
sendinput ^t ; CTRL+t this will [open a new tab] + goto adress bar
sleep 150
texta = https://translate.google.com/#auto/%TransLationTo%/
textb = %clipboard% ;selected text
clipboard=%texta%%textb%
sleep 150
sendinput ^v ; paste the selected text
sleep 150
sendinput {enter} 
clipboard=%textb%
} else {
sendinput ^c ;copy the selected text to clipboard memory
sleep 150
texta = https://translate.google.com/#auto/%TransLationTo%/
textb = %clipboard% ;selected text

clipboard=%texta%%textb%
run %clipboard%
clipboard=%textb%
}
}

} ;End GetKeyState


sleep 50
GuiControl,, var, %KeypressValue%

} ;End Loop


GuiControl,, var, "Scan Pause"
Gui, show

;-----------------------
~esc::exitapp

f1::
If Doloop=1
{
DoLoop := 0
}else{
reload
}
return

;-----------------------

WriteReg_KeypressValue(a)
{
RegWrite, REG_SZ, HKEY_CURRENT_USER,software\GetKeypressValue,KeypressValue,%a%  ;clear the KeypressValue
}

1 - KeypressToREG.ahk

; For the Changelog you can look to the Bottom of the code.
; This code works with a getkeyname from a Dllcall (See Bottom Script- by Lexikos)
; KeypressToREG.ahk comes from KeypressOSD.ahk that was Created by Author RaptorX
; you can press the esc key to exit.

#SingleInstance force
#NoEnv
SetBatchLines, -1
ListLines, Off

; Settings
    global TransN                := 200      ; 0~255
    global ShowSingleKey         := True
    global ShowMouseButton       := True
    global ShowSingleModifierKey := True
    global ShowModifierKeyCount  := true
    global ShowStickyModKeyCount := false
    global DisplayTime           := 2000     ; In milliseconds
    global GuiPosition           := "Bottom" ; Top or Bottom
    global FontSize              := 50
    global GuiHeight             := 115

CreateGUI()
CreateHotkey()
pre_prefix := "" 
prefix := ""
pre_key := ""
_key := ""
key := ""
return

OnKeyPressed:
    try {
        key := GetKeyStr()
        ShowHotkey(key)
        SetTimer, HideGUI, % -1 * DisplayTime
    }
return

OnKeyUp:
return

_OnKeyUp:
    tickcount_start := A_TickCount
return


CreateGUI() {
    global

    Gui, +AlwaysOnTop -Caption +Owner +LastFound +E0x20
    Gui, Margin, 0, 0
    Gui, Color, Black
    Gui, Font, cWhite s%FontSize% bold, Arial
    Gui, Add, Text, vHotkeyText Center y20

    WinSet, Transparent, %TransN%
}

CreateHotkey() {
    Loop, 95
    {
        k := Chr(A_Index + 31)
        k := (k = " ") ? "Space" : k

        Hotkey, % "~*" k, OnKeyPressed
        Hotkey, % "~*" k " Up", _OnKeyUp
    }

    Loop, 24 ; F1-F24
    {
        Hotkey, % "~*F" A_Index, OnKeyPressed
        Hotkey, % "~*F" A_Index " Up", _OnKeyUp
    }

    Loop, 10 ; Numpad0 - Numpad9
    {
        Hotkey, % "~*Numpad" A_Index - 1, OnKeyPressed
        Hotkey, % "~*Numpad" A_Index - 1 " Up", _OnKeyUp
    }

    Otherkeys := "WheelDown|WheelUp|WheelLeft|WheelRight|XButton1|XButton2|Browser_Forward|Browser_Back|Browser_Refresh|Browser_Stop|Browser_Search|Browser_Favorites|Browser_Home|Volume_Mute|Volume_Down|Volume_Up|Media_Next|Media_Prev|Media_Stop|Media_Play_Pause|Launch_Mail|Launch_Media|Launch_App1|Launch_App2|Help|Sleep|PrintScreen|CtrlBreak|Break|AppsKey|NumpadDot|NumpadDiv|NumpadMult|NumpadAdd|NumpadSub|NumpadEnter|Tab|Enter|Esc|BackSpace"
               . "|Del|Insert|Home|End|PgUp|PgDn|Up|Down|Left|Right|ScrollLock|CapsLock|NumLock|Pause|sc145|sc146|sc046|sc123"
    Loop, parse, Otherkeys, |
    {
        Hotkey, % "~*" A_LoopField, OnKeyPressed
        Hotkey, % "~*" A_LoopField " Up", _OnKeyUp
    }

    If ShowMouseButton {
        Loop, Parse, % "LButton|MButton|RButton", |
            Hotkey, % "~*" A_LoopField, OnKeyPressed
    }

    for i, mod in ["Ctrl", "Shift", "Alt"] {
        Hotkey, % "~*" mod, OnKeyPressed
        Hotkey, % "~*" mod " Up", OnKeyUp
    }
    for i, mod in ["LWin", "RWin"]
        Hotkey, % "~*" mod, OnKeyPressed
}

ShowHotkey(HotkeyStr) {
    WinGetPos, ActWin_X, ActWin_Y, ActWin_W, ActWin_H, A
    if !ActWin_W
        throw

    text_w := (ActWin_W > A_ScreenWidth) ? A_ScreenWidth : ActWin_W

    ;remove this gui codeline if you want only to Write the Value to Windows registry
    ;GuiControl,     , HotkeyText, %HotkeyStr%
    ;GuiControl,     , HotkeyText, %HotkeyStr%

    RegWrite, REG_SZ, HKEY_CURRENT_USER,software\GetKeypressValue,KeypressValue,%HotkeyStr%
     HotkeyText :=""

    ;remove this gui codeline if you want only to Write the Value to Windows registry
    ;GuiControl, Move, HotkeyText, w%text_w% Center
    ;GuiControl, Move, HotkeyText, w%text_w% Center

    if (GuiPosition = "Top")
        gui_y := ActWin_Y
    else
        gui_y := (ActWin_Y+ActWin_H) - 115 - 50

    ;remove this gui codeline if you want only to Write the Value to Windows registry
    ;Gui, Show, NoActivate x%ActWin_X% y%gui_y% h%GuiHeight% w%text_w%
    ;Gui, Show, NoActivate x%ActWin_X% y%gui_y% h%GuiHeight% w%text_w%
}

GetKeyStr() {
    static modifiers := ["Ctrl", "Shift", "Alt", "LWin", "RWin"]
    static repeatCount := 1

    for i, mod in modifiers {
        if GetKeyState(mod)
            prefix .= mod " + "
    }

    if (!prefix && !ShowSingleKey)
        throw

    key := SubStr(A_ThisHotkey, 3)

    if (key ~= "i)^(Ctrl|Shift|Alt|LWin|RWin)$") {
        if !ShowSingleModifierKey {
            throw
        }
        key := ""
        prefix := RTrim(prefix, "+ ")

        if ShowModifierKeyCount {
            if !InStr(prefix, "+") && IsDoubleClickEx() {
                if (A_ThisHotKey != A_PriorHotKey) || ShowStickyModKeyCount {
                    if (++repeatCount > 1) {
                        prefix .= " ( * " repeatCount " )"
                    }
                } else {
                    repeatCount := 0
                }
            } else {
                repeatCount := 1
            }
        }
    } else {
        if ( StrLen(key) = 1 ) {
            key := GetKeyChar(key, "A")
        } else if ( SubStr(key, 1, 2) = "sc" ) {
            key := SpecialSC(key)
        } else if (key = "LButton") && IsDoubleClick() {
            key := "Double-Click"
        }
        _key := (key = "Double-Click") ? "LButton" : key

        static pre_prefix, pre_key, keyCount := 1
        global tickcount_start
        if (prefix && pre_prefix) && (A_TickCount-tickcount_start < 300) {
            if (prefix != pre_prefix) {
                result := pre_prefix pre_key ", " prefix key
            } else {
                keyCount := (key=pre_key) ? (keyCount+1) : 1
                key := (keyCount>2) ? (key " (" keyCount ")") : (pre_key ", " key)
            }
        } else {
            keyCount := 1
        }

        pre_prefix := prefix
        pre_key := _key

        repeatCount := 1
    }
    return result ? result : prefix . key
}

SpecialSC(sc) {
    static k := {sc046: "ScrollLock", sc145: "NumLock", sc146: "Pause", sc123: "Genius LuxeMate Scroll"}
    return k[sc]
}

; by Lexikos - https://autohotkey.com/board/topic/110808-getkeyname-for-other-languages/#entry682236
GetKeyChar(Key, WinTitle:=0) {
    thread := WinTitle=0 ? 0
        : DllCall("GetWindowThreadProcessId", "ptr", WinExist(WinTitle), "ptr", 0)
    hkl := DllCall("GetKeyboardLayout", "uint", thread, "ptr")
    vk := GetKeyVK(Key), sc := GetKeySC(Key)
    VarSetCapacity(state, 256, 0)
    VarSetCapacity(char, 4, 0)
    n := DllCall("ToUnicodeEx", "uint", vk, "uint", sc
        , "ptr", &state, "ptr", &char, "int", 2, "uint", 0, "ptr", hkl)
    return StrGet(&char, n, "utf-16")
}

IsDoubleClick(MSec = 300) {
    Return (A_ThisHotKey = A_PriorHotKey) && (A_TimeSincePriorHotkey < MSec)
}

IsDoubleClickEx(MSec = 300) {
    preHotkey := RegExReplace(A_PriorHotkey, "i) Up$")
    Return (A_ThisHotKey = preHotkey) && (A_TimeSincePriorHotkey < MSec)
}

HideGUI() {
    Gui, Hide
}

~esc::exitapp 

;---------------------------------------------
; ChangeLog : v2.22 (2017-02-25) - Now pressing the same combination keys continuously more than 2 times,
;                                  for example press Ctrl+V 3 times, will displayed as "Ctrl + v (3)"
;             v2.21 (2017-02-24) - Fixed LWin/RWin not poping up start menu
;             v2.20 (2017-02-24) - Added displaying continuous-pressed combination keys.
;                                  e.g.: With CTRL key held down, pressing K and U continuously will shown as "Ctrl + k, u"
;             v2.10 (2017-01-22) - Added ShowStickyModKeyCount option
;             v2.09 (2017-01-22) - Added ShowModifierKeyCount option
;             v2.08 (2017-01-19) - Fixed a bug
;             v2.07 (2017-01-19) - Added ShowSingleModifierKey option (default is True)
;             v2.06 (2016-11-23) - Added more keys. Thanks to SashaChernykh.
;             v2.05 (2016-10-01) - Fixed not detecting "Ctrl + ScrollLock/NumLock/Pause". Thanks to lexikos.
;             v2.04 (2016-10-01) - Added NumpadDot and AppsKey
;             v2.03 (2016-09-17) - Added displaying "Double-Click" of the left mouse button.
;             v2.02 (2016-09-16) - Added displaying mouse button, and 3 settings (ShowMouseButton, FontSize, GuiHeight)
;             v2.01 (2016-09-11) - Display non english keyboard layout characters when combine with modifer keys.
;             v2.00 (2016-09-01) - Removed the "Fade out" effect because of its buggy.
;                                - Added support for non english keyboard layout.
;                                - Added GuiPosition setting.
;             v1.00 (2013-10-11) - First release.
;--------------------------------------------
0

Это не совсем просто, но это можно сделать с усилием.

В вашем примере для первых двух частей, куда вы отправляете ^ c в обоих случаях, я реализовал нечто очень близкое к этому для копирования скрытого текста в Word. Для этого случая использования не имеет значения, выполняется ли ^ c при каждом нажатии клавиши, а затем для "части 2", если второй ^ c соответствует тому, что вы можете назвать "временем двойного щелчка" - что является плохой номенклатурой так как никто ничего не нажимает - тогда и скрытый текст будет скопирован. Я назову это "время двойного нажатия" вместо времени двойного нажатия, и в любом случае хорошее начальное значение составляет около 500 мс.

Пример 1

Так что в моем коде, если я нажимаю ^ c один раз, он копирует. Если я нажимаю ^ ca второй раз, в течение 500 мс, он копирует скрытый текст (т.е. двойное нажатие). Если я нажимаю ^ ca во второй раз, но это было> 500 мс с момента последнего нажатия, то он просто копирует снова (без вреда, без фола).

Для этого вы создаете функцию, которая вызывается для горячей клавиши ^ c (которая является клавишей блокировки клавиш, т. Е. У нее нет тильды). Внутри функции статическая переменная используется для отслеживания времени последнего выполнения, а затем сравнивается с текущим временем выполнения. На основании результатов сравнения он либо отправляет ^ c, либо вызывает любой другой код, который вы хотите выполнить (или выполняет оба). Так что это будет работать для первых 2 частей вашего кода выше.

Оптимальное время для копирования / вставки

Кстати, вы также можете очистить буфер обмена перед копированием, а затем использовать ClipWait , чтобы минимизировать динамическое время ожидания, которое потребуется для того, чтобы скопированный контент появился в буфере обмена. Это лучшее из обоих миров для минимальной задержки и максимальной надежности.

Пример 2

Другая выполнимая реализация, которая немного отличается, состоит в том, чтобы использовать модификатор + нажатие клавиши (с блокирующим определением горячей клавиши) для вызова функции, которая подсчитывает, сколько раз нажатие клавиши было нажато, прежде чем вы отпустите модификатор. В примере 1 ^ c выполняется, как только вы нажимаете ^ c. В следующем примере ^ c не будет отправлен, пока вы не отпустите ^ c.

Так для примера 2 ...

  • Если ваша последовательность нажатий клавиш была {Ctrl Down}{c down}{c up}{Ctrl Up} , вариант 1 будет выполнен
  • Если ваша последовательность нажатий клавиш была {Ctrl Down}{c down}{c up}{c down}{c up}{Ctrl Up} , вариант 2 будет выполнен
  • ...
  • Если ваша последовательность нажатий клавиш была {Ctrl Down}{c down}{c up}{c down}{c up}{c down}{c up}{c down}{c up}{c down}{c up}{Ctrl Up} , вариант 5 будет выполнен

В некоторых случаях, когда я использую это для 5 или более опций, я обычно показываю всплывающую подсказку или графический интерфейс, с помощью которого выбирается опция. Начальная горячая клавиша вызывает всплывающую подсказку / графический интерфейс пользователя и выбирает опцию 1. Удерживая нажатой клавишу Ctrl (в этом примере), экран GUI отображается, и опция не выбрана. т. е. вы должны полностью отключить модификатор горячей клавиши (управление), чтобы последовательность завершилась (немного отличается от приведенного выше примера). Пока у вас выключен модификатор, вы можете продолжать нажимать клавишу, и это будет увеличивать, какая опция выбрана, затем вы отпускаете клавишу модификатора, чтобы завершить выбор. Для многопользовательских меню, подобных этому, в которых используется графический интерфейс, у меня также есть циклический выбор опций, поэтому, если есть только 5 опций или что-то еще, то, если вы доберетесь до 6, он просто возвращается к 1 и позволяет вам переключать опции до получить тот, который вы хотите.

Это лучше для определенных вещей, когда вы хотите иметь несколько опций, нажимая клавиши, и вам не нужно, чтобы они были такими же быстрыми, поскольку они будут ждать, пока вы не отпустите клавиши для выполнения вместо (Пример 1), переходя на это, как только вы нажмете их.

Так что один из способов сделать это заключается в следующем:

Сначала вы создаете функцию, которая вызывается вашей горячей клавишей (пример ^ c). Эта функция отслеживает, сколько нажатий клавиш нажимается путем увеличения статической и / или глобальной переменной (зависит от настроек вашего кода).

myOption := ((myOption="") || (myOption=0) || (myOption=6)) ? 1 : myOption+1         ; set comparison value to max number of options and this code will cycle through them

Тернарный оператор здесь просто проверяет, инициализируем ли мы (переменная null или 0), и установит ли он значение 1, или мы достигли максимального количества опций + 1, т. Е. 5 + 1 = 6, например, в этом случае для 5 выбираемые параметры, затем также сбросьте до 1. В противном случае (значение после двоеточия) просто увеличьте выбранный параметр на 1.

Первая функция также вызывает вторую функцию «обработчик» асинхронно через SetTimer (одноразовый вызов, поэтому SetTimer будет использоваться с некоторым отрицательным минимальным значением, скажем, -100). Это позволяет первой функции завершиться, чтобы основной поток мог продолжить выполнение, в то время как вторая функция также продолжает выполняться. т.е. вторая функция может выполняться, пока первая функция вызывается снова и снова для каждого последовательного нажатия клавиши, которое соответствует определению горячей клавиши. Если вы помещаете все в одну функцию, выполнение не завершается с первого раза, и вы не можете обнаружить последовательные нажатия клавиш с помощью определения горячей клавиши. (Вы все еще можете обнаружить их вручную, но более просто просто использовать существующую структуру горячих клавиш для обнаружения)

Вторая функция обработчика состоит из двух частей. Первая часть - это просто цикл, который проверяет, не выключен ли ваш модификатор. т.е.

While GetKeyState("Control", "P")    ; wait for user to release modifier before continuing
    Sleep 10

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

Это выбирается с помощью переменной, которая увеличивается первой функцией при каждом нажатии горячей клавиши, т.е.

If (myOption=1)
    function1()

Else If (myOption=2)
    function2()

...

Else If (myOption=5)
    function5()

Чтобы это работало, вам также необходимо убедиться, что ваша область переменной myOption подходит для функций (общих или глобальных).

Escape Handler

И последнее, что я также сделаю для этой настройки с несколькими опциями, - это реализация опции escape на случай, если я решу не выполнять ни одну из опций. Для этого у меня обычно есть третья функция в качестве обработчика escape, которая включена как условная горячая клавиша в первой функции.

Так, например, установите горячую клавишу ^ Escape с кодом, который вызовет экранирование, если нажата модификатор +escape. Это можно сделать, установив myOption = 0 и отправив {modifier up} , чтобы принудительно завершить цикл обработчика, а затем завершить его без каких-либо действий. Это заставляет обработчик завершать работу без каких-либо других действий, кроме отключения условной горячей клавиши для обработчика Escape.

Нить, NoTimers, Ложь

И последнее замечание: вам может понадобиться использовать Thread, NoTimers, False в первой вызывающей функции, которая влияет на последующие запущенные потоки, но необходима для немедленного прерывания первых строк кода длиной 15 мс /1000 другим вызовом горячей клавиши. Если у вас этого нет, нажатия клавиш могут быть "сброшены", или ваш пробег может варьироваться в зависимости от работы.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .