Skróty klawiszowe AutoHotkey

> Dodaj do ulubionych

Wprowadzenie i kilka prostych przykładów

Skróty klawiszowe (ang. hotkeys lub shortcut keys) służą do wygodnego wykonywania różnych czynności, takich jak np. uruchamianie programów lub makr klawiaturowych). W poniższym przykładowym skrypcie zdefiniowany jest skrót klawiszowy Win+N uruchamiający program Notatnik. Krzyżyk (#) oznacza klawisz Windows i występuje tu w roli modyfikatora:

#n::
Run Notepad
return

Instrukcja return znajdująca się w ostatnim wierszu powyższego skryptu oznacza koniec definicji skrótu klawiszowego. Jeśli definicja skrótu klawiszowego musi być zapisana w jednym wierszu, można ją wpisać bezpośrednio za drugim dwukropkiem. Innymi słowy nie trzeba wówczas wstawiać instrukcji return, ponieważ jest ona dorozumiana:

#n::Run Notepad

Jeśli chcesz użyć kilku modyfikatorów w definicji skrótu klawiszowego, napisz je jeden obok drugiego w dowolnej kolejności. Sekwencja modyfikatorów ^!s użyta w poniższym przykładzie oznacza skrót Ctrl+Alt+S:

^!s::
Send Z poważaniem,{enter}Jan Kowalski ; Ten fragment kodu wysyła znaki z klawiatury do aktywnego (znajdującego się na wierzchu) okna.
return

Poniższa tabela zawiera wykaz modyfikatorów, jakich można używać do definiowania skrótów klawiszowych:

SymbolOpis
#Win (klawisz z logo systemu Windows). W wersji v1.0.48.01+, dla systemów Windows Vista i nowszych, skróty klawiszowe zawierające w definicji klawisz Windows (np. #a) przed wysłaniem litery „L” czekają na zwolnienie klawisza Windows. Pozwala to uniknąć zablokowania komputera przez instrukcję Send, jeśli zostanie ona użyta w takim skrócie klawiszowym. Dotyczy to wszystkich trybów wysyłania z wyjątkiem SendPlay, który tego nie potrzebuje i trybu ślepego.
!Alt
^Ctrl
+Shift
&Znak & można wstawić między dowolne dwa klawisze lub przyciski myszy, aby połączyć je we własny skrót klawiszowy. Szczegółowe informacje na ten temat znajdują się poniżej. Takie skróty klawiszowe są ignorowane (nieaktywne) w systemach Windows 95/98/Me.
<Wybiera lewy klawisz z pary dwóch klawiszy, np. skrót <!a jest prawie tym samym, co skrót !a, lecz można go wywołać tylko przy użyciu lewego klawisza Altspan>. Symbol ten jest ignorowany w systemach Windows 95/98/ME.
>Wybiera prawy klawisz z pary klawiszy. Symbol ten jest ignorowany w systemach Windows 95/98/ME.
<^>!AltGr (ang. alternate graving). Jeżeli na klawiaturze znajduje się klawisz AltGr zamiast prawego klawisza Alt, to te symbole mogą zazwyczaj być traktowane jako AltGr (w systemach Windows NT/2k/XP i nowszych). Na przykład:
      <^>!m::MsgBox Naciśnięto AltGr+m.
      <^<!m::MsgBox Naciśnięto Lewy    Ctrl+Lewy Alt+m.
      
Aby zamienić klawisz AltGr w skrót klawiszowy, należy zastosować następującą instrukcję (żaden z powyższych skrótów nie może być w tym samym czasie zdefiniowany):
      LControl & RAlt::MsgBox Naciśnięto    klawisz AltGr.
      
*Symbol wieloznaczny: oznacza dowolny klawisz, który może zostać użyty z pozostałymi klawiszami zdefiniowanymi w skrócie. Często używa się go w połączeniu z klawiszami i przyciskami przedefiniowywania. Na przykład:
      *#c::Run Calc.exe  ; Równoznaczny z Win+C, Shift+Win+C,    Ctrl+Win+C itd.
*ScrollLock::Run Notepad ; Naciśnięcie klawisza Scroll Lock uruchomi ten skrypt nawet, gdy klawisze przełączające będą wciśnięte.
Symbol ten jest ignorowany w systemach Windows 95/98/ME.
~Naciśnięcie skrótu klawiszowego nie powoduje zablokowania (ukrycia przed systemem) standardowej funkcji klawisza użytego w tym skrócie. W obu przedstawionych poniżej przypadkach zdarzenie kliknięcia przycisku myszy przez użytkownika zostanie wysłane do aktywnego okna:
      ~RButton::MsgBox Kliknięto prawy przycisk    myszy.
~RButton & C::MsgBox Naciśnięto klawisz C przy wciśniętym prawym przycisku myszy.
Uwagi: 1) W odróżnieniu od pozostałych przedrostków, tylda może występować w niektórych wariantach skrótu klawiszowego a w innych być nieobecna; 2) W specjalnych skrótach klawiszowych zastępujących alt-tab tylda jest zawsze ignorowana; 3) Tylda nie jest rozpoznawana w systemach 95/98/ME.
$Symbol ten najczęściej jest używany, gdy w skrypcie użyto polecenia Send w celu wysłania klawiszy, które składają się na sam skrót klawiszowy, co może powodować uruchamianie skryptu przez samego siebie. Szczegóły działania przedrostka $ zależą od systemu operacyjnego:
W systemach Windows NT4/2k/XP i nowszych: przedrostek $ wymusza użycie techniki przechwytywania zdarzeń klawiatury do implementacji skrótu klawiszowego, czego efektem ubocznym jest uniemożliwienie poleceniu Send uruchomienie tego skrótu. Użycie przedrostka $ jest równoznaczne z wpisaniem nad definicją skrótu klawiszowego instrukcji #UseHook.
W systemach Windows 95/98/Me: klawisz skrótu zostaje wyłączony na czas wykonywania jego wątku i włączony po zakończeniu jego wykonywania. W efekcie ubocznym, jeśli ustawienie #MaxThreadsPerHotkey zostanie ustawione na wartość wyższą od 1, będzie się zachowywać jakby było ustawione na 1.
UPSłowo UP znajdujące się za nazwą skrótu klawiszowego powoduje jego uruchomienie po zwolnieniu klawiszy, zamiast po ich naciśnięciu. Poniższy przykładowy skrypt zmienia definicję lewego klawisza Windows (LWin) na lewy klawisz Ctrl (LControl):
      *LWin::Send {LControl Down}
      *LWin Up::Send {LControl Up}
      
Słowo Up może być także używane ze zwykłymi skrótami klawiszowymi, np.: ^!r Up::MsgBox Naciśnięto i zwolniono kombinację klawiszy Ctrl+Alt+R. Słowo to działa także z kombinacjami skrótów klawiszowych (np. F1 & e Up::)
Ograniczenia: 1) Słowo Up nie działa dla przycisków dżojstika; 2) Słowo Up działa w systemach Windows NT4/2000/XP i nowszych; 3) Skrót klawiszowy ze słowem Up pozbawiony normalnego odpowiednika kompletnie przejmuje klawisz, aby zapobiec jego zablokowaniu. Jednym ze sposobów na uniknięcie tego jest dodanie tyldy, np. ~LControl up::.
Przy użyciu techniki podobnej do powyższej klawisz skrótu można zamienić w klawisz przedrostka. Zaletą tego jest to, że podczas gdy klawisz skrótu zostanie uruchomiony w momencie jego zwolnienia, to stanie się to tylko pod warunkiem, że podczas gdy był on wciśnięty nie naciśnięto żadnego innego klawisza. Na przykład:
      LControl & F1::return  ; Lewy Ctrl jest przedrostkiem, ponieważ    jego oznaczenie znajduje się przed znakiem & w przynajmniej jednym    miejscu.
LControl::MsgBox Zwolniono lewy klawisz Ctrl nie używając go do zmodyfikowania żadnego innego klawisza.

Pełna lista klawiszy i przycisków dżojstika i myszy znajduje się w liście klawiszy

Jeśli kilka skrótów klawiszowych pełni tę samą funkcję, to można ich definicje wypisać jedną pod drugą. Na przykład:

^Numpad0::
^Numpad1::
MsgBox Napis ten można wyświetlić za pomocą kombinacji klawiszy Ctrl+Numpad0 lub Ctrl+Numpad1.
return

Wybrany klawisz lub wybraną kombinację klawiszy można wyłączyć na poziomie systemowym nie przypisując im żadnej funkcji do wykonania. Poniższy przykładowy skrypt wyłącza prawy klawisz Windows:

RWin::return

Skróty klawiszowe wrażliwe na kontekst

Za pomocą dyrektywy #IfWinActive/Exist można sprawić, że wybrany skrót klawiszowy będzie powodował wykonanie różnych czynności (albo niczego nie będzie powodował) w zależności od typu istniejącego lub aktywnego okna. Na przykład:

#IfWinActive, ahk_class Notepad
^a::MsgBox Naciśnięto kombinację Ctrl+A, podczas gdy aktywne było okno Notatnika. Naciśnięcie kombinacji Ctrl+A w każdym innym oknie spowoduje przekazanie zdarzenia naciśnięcia klawiszy Ctrl+A do tego okna.
#c::MsgBox Naciśnięto kombinację klawiszy Win-C, podczas gdy było aktywne okno Notatnika.
#IfWinActive
#c::MsgBox Naciśnięto kombinację klawiszy Win+C, podczas gdy aktywne było jakiekolwiek okno inne niż Notatnik.

Tworzenie kombinacji i inne funkcje

Przy użyciu znaku & można definiować kombinacje dowolnych dwóch klawiszy (z wyjątkiem przycisków dżojstika). Aby uruchomić poniższy skrót klawiszowy, należy najpierw nacisnąć klawisz Numpad0 a następnie nie puszczając go nacisnąć klawisz Numpad1:

Numpad0 & Numpad1::MsgBox Naciśnięto klawisz Numpad1, podczas gdy był trzymany wciśnięty klawisz Numpad0.
Numpad0 & Numpad2::Run Notepad

W powyższym przykładzie klawisz Numpad0 jest przedrostkiem; jednocześnie klawisz Numpad0 traci swoją pierwotną funkcję. Aby temu zapobiec, można w skrypcie zdefiniować dla tego klawisza nową funkcję, np.:

Numpad0::WinMaximize A   ; Maksymalizuje aktywne okno.
Numpad0::Send {Numpad0}  ; Sprawia, że zwolnienie klawisza Numpad0 powoduje wysłanie zdarzenia naciśnięcia klawisza Numpad0. Zobacz komentarz pod spodem.

Obecność w skrypcie jednego z powyższych skrótów klawiszowych powoduje, że w wyniku zwolnienia klawisza Numpad0 wykonywane jest wskazane działanie, ale tylko wtedy, gdy podczas gdy klawisz Numpad0 był wciśnięty nie naciśnięto żadnego innego klawisza.

Klawisze Numlock, Capslock oraz Scrolllock: te klawisze można wyłączyć (AlwaysOff) lub włączyć na stałe (AlwaysOn). Na przykład: SetNumlockState AlwaysOn

Przesłanianie klawiszy Eksploratora: standardowe skróty klawiszowe Eksploratora Windows, takie jak Win+E (#e) i Win+R (#r) można zmieniać poprzez przypisanie im dowolnej funkcji w skrypcie. Szczegółowe informacje na ten temat znajdują się na stronie o przesłanianiu.

Zamienniki dla kombinacji Alt+Tab: można zdefiniować alternatywne skróty klawiszowe do wykonywania czynności dostępnej poprzez skrót klawiszowy Alt+Tab. Na przykład poniższe dwa skróty umożliwiają przedefiniowanie tej kombinacji w taki sposób, aby można ją było wykonywać prawą ręką:

RControl & RShift::AltTab  ; Naciśnij prawy klawisz Ctrl, a następnie do zmiany okien w prawo użyj klawisza Shift.
RControl & Enter::ShiftAltTab  ; Nie zwalniając prawego klawisza Ctrl naciśnij klawisz Enter, aby zmienić kierunek przeglądania.

Szczegółowe informacje na ten temat znajdują się w części o skrócie klawiszowym Alt+Tab.

Skróty klawiszowe z użyciem kółka myszy

Skróty klawiszowe uruchamiane poprzez pokręcenie kółkiem myszy tworzy się przy użyciu słów kluczowych WheelDown i WheelUp. Od wersji v1.0.48 dostępne są także nazwy WheelLeft i WheelRight, ale działają one tylko w systemach Windows od wersji Vista. Oto kilka przykładowych skrótów klawiszowych z użyciem kółka myszy:

MButton & WheelDown::MsgBox Pokręcono kółkiem myszy, podczas gdy wciśnięty był jej środkowy przycisk.
^!WheelUp::MsgBox Pokręcono kółkiem myszy do góry, podczas gdy naciśnięte były klawisze Ctrl+Alt.

Od wersji v1.0.43.03 dostępna jest zmienna A_EventInfo zawierająca informację o długości drogi przekręcenia kółkiem. Zazwyczaj wartość ta to 1, ale w następujących sytuacjach może być większa lub mniejsza:

  • Jeśli mysz informuje o odległościach mniejszych niż jedna kreska podziałki, zmienna A_EventInfo może zawierać wartość 0;
  • Jeśli kółko zostanie przekręcone szybko (w zależności od typu myszy), zmienna A_EventInfo może mieć wartość większą niż 1. Do sprawdzenia swojej myszy można użyć poniższego skrótu klawiszowego: ~WheelDown::ToolTip %A_EventInfo%

Do najbardziej przydatnych zastosowań kółka myszy w skrótach klawiszowych należą modyfikacje sposobu przewijania tekstu w oknach. Na przykład poniższa para skrótów sprawia, że gdy wciśnięty jest klawisz Ctrl, pokręcenie kółkiem myszy powoduje przewijanie zawartości okna w poziomie zamiast w pionie:

~LControl & WheelUp::  ; Przewijanie w lewo.
ControlGetFocus, fcontrol, A
Loop 2  ; <-- Zwiększenie tej wartości przyspieszy przewijanie.
    SendMessage, 0x114, 0, 0, %fcontrol%, A  ; 0x114 to WM_HSCROLL a 0 znajdujące się za tą wartością to SB_LINELEFT.
return

~LControl & WheelDown::  ; Przewijanie w prawo.
ControlGetFocus, fcontrol, A
Loop 2  ; <-- Zwiększenie tej wartości przyspieszy przewijanie.
    SendMessage, 0x114, 1, 0, %fcontrol%, A  ; 0x114 to WM_HSCROLL a 1 znajdująca się za tą wartością to SB_LINERIGHT.
return

Ponieważ skróty klawiszowe z użyciem kółka myszy mogą generować tylko zdarzenia „naciśnięcia”, nie można ich używać jako skrótów uruchamianych podczas zwalniania klawisza.

Porady i wskazówki dotyczące tworzenia skrótów klawiszowych

Każdy klawisz znajdujący się na klawiaturze numerycznej może zostać użyty w dwóch definicjach skrótu klawiszowego, zależnie od stanu klawisza Numlock. Można także sprawić, aby wybrany klawisz z tej klawiatury uruchamiał tę samą procedurę niezależnie od stanu klawisza Numlock. Na przykład:

NumpadEnd::
Numpad1::
MsgBox, Ten klawisz skrótu zostanie uruchomiony niezależnie od stanu klawisza Numlock.
return

Jeśli przed klawiszem przedrostkowym zostanie wstawiona tylda (~) choćby tylko w jednym miejscu, zdarzenie naciśnięcia tego klawisza będzie zawsze wysyłane do aktywnego okna. Na przykład w poniższym przykładzie do aktywnego okna zostaną wysłane wszystkie zdarzenia naciśnięcia prawego przycisku myszy, mimo że tylko jedna z definicji zawiera tyldę:

 ~RButton & LButton::MsgBox Naciśnięto lewy przycisk myszy, podczas gdy był wciśnięty prawy przycisk myszy.
RButton & WheelUp::MsgBox Pokręcono kółkiem myszy do góry, podczas gdy wciśnięty był prawy przycisk myszy.

Za pomocą polecenia Suspend można tymczasowo zawiesić wszystkie skróty klawiszowe oprócz określonych wyjątków. Jeśli potrzebujesz bardziej precyzyjnej kontroli, skorzystaj z dyrektyw #IfWinActive/Exist.

Za pomocą polecenia Hotkey można dynamicznie tworzyć skróty klawiszowe podczas działania skryptu. Za pomocą polecenia Hotkey można także modyfikować, wyłączać i włączać wybrane skróty klawiszowe skryptu.

W skrótach klawiszowych dżojstika aktualnie nie są obsługiwane przedrostki modyfikujące, takie jak ^ (Ctrl) i # (Win). Można jednak naśladować efekt ich użycia za pomocą polecenia GetKeyState:

Joy2::
if not GetKeyState("Control")  ; Ani lewy ani prawy klawisz Ctrl nie jest wciśnięty.
    return  ; tzn. nic nie rób.
MsgBox Naciśnięto drugi przycisk pierwszego dżojstika, podczas gdy był wciśnięty klawisz Ctrl.
return

Czasami konieczne jest, aby skrót klawiszowy poczekał na zwolnienie klawiszy modyfikujących i dopiero po ich zwolnieniu kontynuował działanie. Rozważmy poniższy przykład:

^!s::Send {Delete}

Naciśnięcie kombinacji Ctrl+Alt+S system operacyjny potraktowałby, jak naciśnięcie kombinacji Ctrl+Alt+Delete. Problem ten można rozwiązać poprzez użycie polecenia KeyWait nakazującego poczekać z wykonywaniem skryptu na zwolnienie klawiszy:

^!s::
KeyWait Control
KeyWait Alt
Send {Delete}
return

Jeśli definicja skrótu klawiszowego typu #z:: powoduje zgłoszenie przez AutoHotkey błędu „Invalid Hotkey”, to znaczy, że w Twoim układzie lub języku klawiatury nie ma określonego znaku (w tym przypadku litery „Z”). Zastąp brakujący znak innym, który jest dostępny.

Etykiety skrótu klawiszowego można użyć jako punktu docelowego instrukcji Gosub i Goto. Na przykład: Gosub ^!s

Jednym z częstych zastosowań skrótów klawiszowych jest uruchamianie i wyłączanie powtarzalnych czynności, takich jak serie naciśnięć klawiszy albo kliknięć myszy.

Każdy skrypt jest quasi-wielowątkowy, dzięki czemu nie trzeba czekać na zakończenie działania uruchomionego przez jeden skrót, aby uruchomić następny. Na przykład można używać kolejnych skrótów klawiszowych nawet wtedy, gdy wyświetlone jest okienko MsgBox.

Skróty klawiszowe menu Alt-Tab

Każdy skrót klawiszowy włączający menu Alt-Tab musi składać się z dwóch klawiszy, do połączenia których najczęściej używa się symbolu &. Poniżej znajduje się przykładowy skrót wymagający naciśnięcia kombinacji prawego klawisza Alt i klawisza J lub K, aby otworzyć menu alt-tab:

RAlt & j::AltTab
RAlt & k::ShiftAltTab

AltTab i ShiftAltTab to specjalne polecenia, które są rozpoznawane tylko wówczas, gdy znajdują się w tym samym wierszu, co definicja skrótu klawiszowego. Oto pełna lista takich poleceń:

AltTab: jeśli menu alt-tab jest widoczne, to przechodzi w nim o jeden element. W przeciwnym przypadku wyświetla te menu (tylko, jeżeli skrót klawiszowy składa się z dwóch klawiszy oddzielonych znakiem &; w przeciwnym przypadku nic się nie dzieje).

ShiftAltTab: to samo, co powyżej, tylko przejście następuje wstecz zamiast do przodu.

AltTabAndMenu: jeśli menu alt-tab jest widoczne, to przechodzi w nim o jeden element do przodu. W przeciwnym przypadku wyświetla menu.

AltTabMenuDismiss: zamyka menu Alt-Tab.

Zastosowanie tych poleceń zademonstruję na przykładzie skryptu zamieniającego kółko myszy w przycisk do obsługi menu Alt-Tab. Dzięki poniższym skrótom klawiszowym naciśnięcie środkowego klawisza myszy spowoduje wyświetlenie menu Alt-Tab, a pokręcenie kółkiem — przejście o jeden element tego menu do przodu lub wstecz.

MButton::AltTabMenu
WheelDown::AltTab
WheelUp::ShiftAltTab

Aby wyłączyć menu Alt-Tab włączone za pomocą skrótu klawiszowego bez aktywowania wybranego okna, można użyć poniższego skrótu. Skrypt ten może wymagać modyfikacji w zależności od: 1) sposobu, w jaki menu zostało wyświetlone; 2) tego czy skrypt ma zainstalowany uchwyt do klawiatury.

LCtrl & CapsLock::AltTab
!MButton::  ; Środkowy przycisk myszy. Przedrostek ! powoduje jego uruchomienie, podczas gdy wciśnięty jest klawisz Alt (który musi być wciśnięty, jeśli menu Alt-Tab jest widoczne).
IfWinExist ahk_class #32771  ; Wskazuje, że menu Alt-Tab jest widoczne na ekranie.
    Send !{Escape}{Alt up}
return

Obecnie wszystkie specjalne akcje menu Alt-Tab muszą być przypisane bezpośrednio do skrótu klawiszowego, jak w powyższych przykładach (tzn. nie mogą być używane jak polecenia). Menu Alt-Tab można także wykryć za pomocą instrukcji IfWinExist ahk_class #32771

Można także tworzyć własne akcje menu Alt-Tab za pomocą skrótów klawiszowych. Poniżej znajduje się przykładowy skrót powodujący wyświetlenie menu Alt-Tab i przejście w nim do przodu w wyniku naciśnięcia klawisza F1. Następnie za pomocą klawisza F2 można aktywować wybrane okno (albo nacisnąć klawisz Esc, aby anulować):

*F1::Send {Alt down}{tab} ; W tym przypadku gwiazdka jest wymagana.
!F2::Send {Alt up}  ; Zwalnia klawisz Alt, co powoduje aktywowanie wybranego okna.
~*Escape::
IfWinExist ahk_class #32771
    Send {Escape}{Alt up}  ; Anuluje menu nie aktywując wybranego okna.
return