Autohotkey - Klik dua kali Kombinasi Keystroke untuk Menjalankan Bagian dari Kode Ahk

0

Apakah ada cara untuk melakukan DoubleClick a Keystroke Combination untuk Menjalankan Bagian dari Kode Ahk.

Anda dapat melakukan DoubleClick di Mouse atau Perangkat Sentuh apa pun .

Tapi saya suka melakukan DoubleClick untuk Semua Kombinasi Keystroke saya .

Saya bekerja pada Sistem Windows, dan saya suka Bahasa Autohotkey.

Ini adalah kode yang saya miliki sejauh ini, ide bagus selalu diterima.

#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

Catatan - Hotkeystring <: *: {Ctrl} cv ::> dan Hotkey <{Ctrl} ccc ::> tidak berfungsi.

Frank Quardro
sumber

Jawaban:

1

Anda dapat melakukannya di Sistem Windows, DoubleClicks atau MultiClicks Anda untuk Semua Kombinasi Keystroke untuk Menjalankan Bagian Ahk Kode, (Hotkeys cc: :) - dan jika Anda ingin menggunakannya juga untuk (HotkeyStrings: *: cv: :) Anda dapat mengubah sedikit Script litte.

Dengan dua Script Autohotkey ini Anda dapat melakukannya.

  • 1: Apakah Menyalin otomatis Semua Kombinasi Keystroke Anda ke Kunci Registri Windows Tunggal. (Anda dapat menjalankan ini di Background)

Tampilan menekan tombol pada layar dari kunci registri windows

  • 2: Anda kemudian dapat, hanya menggunakan Nilai String itu dari kunci Registry, Dan menulis Codings untuk melakukan Apa Pun. (Catatan - Skrip Contoh Sederhana ini akan Menampilkan semua Gerakan Keyboard & Mouse Anda di Layar - dan Anda dapat mengujinya dengan DoubleClick tombol Ctrl + (2x) c atau MultiClicks 3x)

HKEY_CURRENT_USER,software\GetKeypressValue,KeypressValue

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

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

tampilkan penekanan tombol pada layar

2 - Anda Bahkan Dapat Menulis Skrip Dari Bahasa lain. (Anda hanya perlu mengakses Single Registry Key itu.)

  • Microsoft Visual Studio
  • Dasar visual
  • Turbo Pascal
  • Bahasa Delphi
  • C ++

  • Bahasa Python

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.
;--------------------------------------------
Philip Lavour
sumber
0

Ini tidak benar-benar mudah, tetapi dapat dilakukan dengan usaha.

Dalam contoh Anda, untuk dua bagian pertama, di mana Anda mengirim ^ c dalam kedua kasus, saya telah menerapkan sesuatu yang sangat dekat dengan ini untuk menyalin teks tersembunyi di Word. Untuk kasus penggunaan itu, tidak masalah jika ^ c dieksekusi pada setiap keystroke dan kemudian untuk "bagian 2", jika ^ c kedua datang dalam apa yang Anda anggap "waktu klik dua kali" - yang merupakan nomenklatur buruk karena tidak ada yang mengklik apa pun - maka teks tersembunyi akan disalin juga. Saya akan menyebutnya "waktu tekan dua kali", vs waktu klik dua kali, dan dalam hal apa pun nilai awal yang baik adalah sekitar 500 ms.

Contoh 1

Jadi dalam kode saya, jika saya tekan ^ c sekali, itu akan disalin. Jika saya menekan ^ ca kedua kalinya, dalam 500 ms, itu menyalin teks tersembunyi (yaitu, tekan dua kali). Jika saya menekan ^ ca kedua kalinya tapi itu> 500ms sejak pers terakhir, maka itu hanya menyalin lagi (tidak ada salahnya busuk).

Untuk melakukan ini, Anda membuat fungsi yang dipanggil untuk hotkey ^ c (yang merupakan hotkey pemblokiran kunci, yaitu tidak memiliki tilde). Di dalam fungsi, variabel statis digunakan untuk melacak waktu eksekusi terakhir, dan kemudian dibandingkan dengan waktu eksekusi saat ini. Berdasarkan hasil perbandingan, ia mengirim ^ c atau memanggil kode apa pun yang ingin Anda jalankan (atau melakukan keduanya). Jadi ini akan bekerja untuk 2 bagian pertama dari kode Anda di atas.

Waktu Optimal untuk Salin / Tempel

Omong-omong, Anda juga dapat menghapus clipboard sebelum menyalin dan kemudian menggunakan ClipWaituntuk meminimalkan waktu tunggu dinamis yang diperlukan untuk konten yang disalin muncul di clipboard. Ini adalah yang terbaik dari kedua dunia untuk keterlambatan minimum dan keandalan maksimum.

Contoh 2

Implementasi lain yang dapat dilakukan yang sedikit berbeda, adalah menggunakan modifier + keystroke (dengan definisi hotkey pemblokiran) untuk memanggil fungsi yang menghitung berapa kali keystroke ditekan sebelum Anda melepaskan modifier. Dalam Contoh 1, ^ c dieksekusi segera setelah Anda menekan ^ c. Dalam contoh berikut ini, ^ c tidak akan dikirim sampai Anda merilis ^ c.

Jadi untuk Contoh 2 ...

  • Jika urutan penekanan tombol Anda adalah {Ctrl Down}{c down}{c up}{Ctrl Up}, kasus 1 akan dieksekusi
  • Jika urutan penekanan tombol Anda adalah {Ctrl Down}{c down}{c up}{c down}{c up}{Ctrl Up}, kasus 2 akan dieksekusi
  • ...
  • Jika urutan keystroke Anda adalah {Ctrl Down}{c down}{c up}{c down}{c up}{c down}{c up}{c down}{c up}{c down}{c up}{Ctrl Up}, kasus 5 akan dieksekusi

Dalam kasus tertentu di mana saya menggunakan ini untuk opsi 5 atau lebih, saya biasanya menunjukkan tooltip atau GUI dengan opsi mana yang dipilih. Hotkey awal memicu tooltip / GUI untuk memunculkan dan memilih opsi 1. Menekan Ctrl (dalam contoh ini) membuat GUI tetap ditampilkan dan opsi tidak dipilih. yaitu, Anda harus benar-benar mematikan pengubah hotkey (kontrol) agar urutan selesai (sedikit berbeda dari contoh di atas). Selama Anda memiliki modifier turun, Anda dapat terus menekan tombol dan itu akan meningkatkan opsi mana yang dipilih, kemudian Anda lepaskan kunci modifier untuk menyelesaikan seleksi. Untuk menu multi-tekan seperti ini yang menggunakan GUI, saya juga memilikinya loop pilihan, jadi jika hanya ada 5 opsi atau sesuatu, maka jika Anda sampai ke 6 itu hanya loop kembali ke 1 dan memungkinkan Anda untuk menggilir opsi sampai Anda dapatkan yang kamu inginkan.

Ini lebih baik untuk hal-hal tertentu di mana Anda ingin memiliki beberapa opsi dengan menekan tombol dan tidak perlu terlalu cepat, karena akan menunggu sampai Anda melepaskan kunci untuk dieksekusi daripada (Contoh 1) melompat segera setelah Anda menekannya.

Jadi salah satu cara untuk melakukan ini adalah sebagai berikut:

Pertama, Anda membuat fungsi yang dipicu oleh hotkey Anda (contoh ^ c). Fungsi ini melacak berapa banyak penekanan tombol yang ditekan dengan menambah variabel statis dan / atau global (tergantung pada pengaturan kode Anda).

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

Operator ternary di sini hanya memeriksa apakah kita sedang inisialisasi (variabel nol atau 0) dan akan ditetapkan ke 1, atau jika kita telah mencapai jumlah maksimal opsi + 1, yaitu 5 + 1 = 6 misalnya dalam kasus ini untuk 5 opsi yang dapat dipilih, kemudian atur ulang ke 1. Jika tidak (nilai setelah titik dua), tambahkan saja opsi yang dipilih sebesar 1.

Fungsi pertama juga memanggil fungsi 'penangan' kedua secara serempak melalui SetTimer(panggilan satu kali, sehingga SetTimer akan digunakan dengan beberapa nilai minimal negatif, katakan -100). Ini memungkinkan fungsi pertama untuk keluar sehingga utas utama dapat terus dijalankan, sementara fungsi kedua juga terus berjalan. yaitu, fungsi kedua dapat berjalan sementara fungsi pertama dipanggil berulang-ulang untuk setiap penekanan tombol berturut-turut yang memenuhi definisi hotkey. Jika Anda memasukkan semuanya ke dalam satu fungsi, eksekusi tidak menyelesaikan pertama kalinya dan Anda tidak dapat mendeteksi penekanan tombol berurutan melalui definisi hotkey. (Anda masih dapat mendeteksinya secara manual tetapi lebih mudah untuk hanya menggunakan kerangka kerja hotkey yang sudah ada sebelumnya untuk deteksi)

Fungsi pengendali kedua memiliki dua bagian. Bagian pertama hanyalah sebuah loop yang memeriksa apakah pengubah Anda masih turun. yaitu,

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

Setelah fungsi handler menghapus loop sementara - yaitu, begitu Anda melepaskan kunci pengubah - semua yang tersisa untuk dieksekusi adalah kode fungsi apa pun yang Anda butuhkan tergantung pada opsi mana yang telah dipilih.

Ini dipilih menggunakan variabel yang fungsi pertama bertambah setiap kali hotkey ditekan, yaitu,

If (myOption=1)
    function1()

Else If (myOption=2)
    function2()

...

Else If (myOption=5)
    function5()

Agar ini berfungsi, Anda juga perlu memastikan bahwa myOptionruang lingkup variabel Anda sesuai antara fungsi (dibagi atau global).

Escape Handler

Satu hal terakhir yang saya juga lakukan untuk pengaturan multi-opsi ini, adalah untuk mengimplementasikan opsi melarikan diri, jika saya memutuskan untuk tidak mengeksekusi salah satu opsi. Untuk melakukan ini, saya biasanya memiliki fungsi ketiga sebagai pengendali melarikan diri yang diaktifkan sebagai tombol pintas bersyarat di fungsi pertama.

Jadi misalnya, atur hotkey ^ Escape dengan kode yang akan memaksa escape jika modifier + escape ditekan. Ini dapat dilakukan dengan mengatur myOption = 0 dan mengirim {modifier up}untuk memaksa loop penangan untuk keluar, dan kemudian menyelesaikan tanpa tindakan. Ini menyebabkan pawang keluar tanpa tindakan lain selain menonaktifkan tombol pintas bersyarat untuk Escape pawang.

Utas, NoTimers, Salah

Satu catatan terakhir adalah bahwa Anda mungkin perlu menggunakan Thread, NoTimers, Falsefungsi panggilan pertama, yang memengaruhi utas yang diluncurkan selanjutnya, tetapi diperlukan untuk memungkinkan 15ms / 1000 baris kode terputus dengan segera oleh panggilan hotkey lainnya. Jika Anda tidak memiliki ini, penekanan tombol mungkin tampak "dijatuhkan", atau jarak tempuh Anda mungkin berbeda untuk menyelesaikan pekerjaan.

Secara umum, untuk semua lonceng dan peluit yang dimiliki AutoHotkey, saya belum menemukan cara yang lebih sederhana untuk membuat makro multi-tombol ditekan untuk bekerja, tetapi begitu Anda mendapatkan sesuatu seperti ini diimplementasikan dalam kerangka kerja yang dapat Anda sesuaikan untuk menjatuhkan berbagai Anda kasus eksekusi menjadi, itu akan berjalan sangat andal.

JJohnston2
sumber