Blog (7)
Komentarze (191)
Recenzje (1)
@BriHecatoZautomatyzuj swoje życie, czyli prosty blog o AutoHotKey — epizod 6

Zautomatyzuj swoje życie, czyli prosty blog o AutoHotKey — epizod 6

12.07.2018 | aktual.: 22.07.2018 12:47

656343

Dzisiaj poopisujemy sobie Hotkeye z użyciem własnych modyfikatorów.

Poprzedni Epizod znajdziecie - tutaj. A zaczynamy dziś od krótkiego powtórzenia.

Hotkey raz jeszcze

Hotkey zapisujemy stosując dwa dwukropki - kod hotkeya po lewej stronie wywołuje akcję po prawej stronie - może mieć dowolną długość - zawrzeć się w jednej linijce lub opisać rozbudowaną funkcję na 300 wierszy nie licząc podprocedur ;)

r::w

taki hotkey spowoduje że wasza klawiatura przy każdym naciśnięciu "r" będzie wysyłała do komputera znak "w". Ten oneliner pozwala na łatwe przemapowanie klawiszy - np. coś z czego sam korzystam w AutoCAD czyli zamiana przecinka z klawiatury numerycznej na kropkę:

NumPadDot::.

Oczywiście znajduje się to wewnątrz dyrektywy #IfWinActive ahk_exe acad.exe.

Dzięki onelinerom można zablokować klawisz w tym sensie że Windows nie odbierze żadnego znaku (zostanie przechwycony i zniwelowany przez działający skrypt):

x::
x::Return

zadziałają obie wersje, z tym że gdzieś przeczytałem że ta z "returnem" jest bardziej elegancka.

To co ma się dziać po wciśnięciu waszego hotkeya zależy tylko od was. Już w 2 epizodzie napisaliśmy skrypt który zawierał 5 linijek a który pozwalał na kopiowanie bocznym klawiszem myszki:

XButton1::			;; kopiuj
	ClipBoard =
	Send, ^c
	ClipWait, 0.5
Return,

zakończenie Returnem jest istotne w takim wypadku.

Hotkeye budowane z modyfikatorami

Hotkey można zbudować (częściej trzeba, ze względu na to by nie zamieniać normalnie działających i potrzebnych przycisków) z jakimś dodatkowym klawiszem. W użyciu mamy zatem:

  • hasz lub płotek - "#" - jest modyfikatorm rozumianym jako wciśnięcie klawisza "Windowsa"
  • daszek - "^" - jest rozumiany jako wciśnięcie "Control"
  • plus - "+" - jest rozumiany jako wciśnięcie "Shift"
  • wykrzyknik - "!" - jest rozumiany jako wciśnięcie "Alt"
  • nawiasy trójkątne = "<" ">" - pozwalają wskazać który ze zdublowanych klawiszy ma być brany pod uwagę - lewy czy prawy (dotyczy Control, Shift, Alt)

Dzięki tym modyfikatorom, które, można ze sobą łączyć otrzymujemy kombinacje hotkeyów takie jak:

^c   - czyli Control+C
#m  -  czyli  Windows+M
!+r  -  czyli Alt+Shift+R

Zwiększa nam to ilość potencjalnych hotkeyów i zabezpiecza przed wykonywaniem skryptów przy normalnym wprowadzaniu tekstu.

Prefiksy

Gwiazdka - "*" - pozwala na uruchomienie skryptu danym hotkeyem bez względu na użyty modyfikator, jednak uruchomi wszystkie inne zawierające ten hotkey. Ok wyjaśnijmy to sobie, zakładając że mamy:

^m:: hotkey nr1
+m:: hotkey nr2
!^m:: hotkey nr2

Każdy hotkey będzie odpalał swoje osobne akcje. Jednakże dopisanie nowego hotkeya ze swoim zestawem poleceń, do tych trzech, w postaci:

*m:: hotkey nr4

zadziała tak, że wciśnięcie dowolnego z hotkeyów od 1 do 3 spowoduje uruchomienie dodatkowo hotkeya 4.

Tylda - "~" - daje do zrozumienia interpreterowi AHK że nie chcemy blokować czy zastępować domyślnego działania klawisza (czy hotkeya), a jedynie dodać jakąś naszą własną fukcję. Możemy np. chcieć otworzyć dialog zapisu pliku w jakimkolwiek programie i podstawić automatycznie w tym dialogu nazwę którą wcześniej skopiowaliśmy do schowka - taki kod powinien zadziałać:

~^s::
    Sleep, 1000
    Send, ^v
Return,

Dolar - "$" - ma znaczenie w takich skryptach które zawierają polecenie Send. załóżmy taką sytuację - dwa jakieś hotkeye które działają zgodnie z naszym założeniem:

h::Send, ribbon

g::Send, house

Wykonanie hotkeya pod klawiszem "g" wysyła nam do aplikacji tekst "house" - w tej sytuacji gdy nie użyliśmy dolara w momencie "publikacji" litery "h" z napisu "house" automatycznie zostanie wykonany ciąg poleceń hotkeya spod klawisza "h".

Aby tego uniknąć przed hotkeyem "h" dopisujemy dolara i inne hotkeye wysyłające literę "h" nie wywołają tego hotkeya..

Jeśli nie mamy żadnego jedno-znakowego hotkeya nie musimy się obawiać niczego.

Jeszcze więcej modyfikatorów

Możemy użyć dowolnej pary klawiszy do hotkeya z czego pierwszy traktowany jest jako modyfikator i nie podlega działaniu prefiksów. Łączenie dwóch klawiszy dokonujemy znakiem "&" ampersanda. Np. tak:

d & f:: akcja!

Działa to tak samo jak używanie shift czy control. Wciskamy pierwszy klawisz trzymając go wciskamy drugi - wtedy skrypt wykonuje swoje działanie a my możemy puścić klawisze. Jednakże pierwszy klawisz będzie zablokowany i samodzielnie nie wyśle swojego znaku. Doszedłem do tego że stosowanie prefiksów nic tu nie daje a wyjście to "uwolnienie" pierwszego klawisza - przypisanie go do siebie samego. Sam posiadam podobny działający zestaw:

d & r:: polecenie 1
d & t:: polecenie 2
d & f:: polecenie 3
d & g:: polecenie 4
d & c:: polecenie 5
d & v:: polecenie 6
d::d  ;;"uwolnienie" pierwszego klawisza

Nie ma absolutnie przeszkód aby takie sekwencje zrobić z przyciskami na myszcze, i to w obie strony:

XButton1 & q:: Send, pierwszy hotkey
q & RButton:: Send, drugi hotkey

Oczywiście należy (jak powyżej) "uwolnić" klawisz, albo przypisać mu własne inne polecenie domyślne.

Wysyłając więcej niż jeden znak (czyli tak właściwie to nie jest remapowanie klawiszy a podawanie do aplikacji całego tekstu) musimy się posłużyć komendą Send:

^h::Send,Bri tu był
g & h::Send, Bri tu był
::gh::Bri tu był

Oczywiście zawsze tez możemy użyć hotstringa ;)

Triki

Jeśli chcesz zamienić klawisz CapsLock w zwykły shift - napisz tak:

CapsLock::Shift

Chcesz szybko sterować skryptem bez potrzeby klikania w menu w zasobniku - napisz np. tak:

~CapsLock::Reload
~ScrollLock::Suspend
+Esc::ExitApp

Są to wewnętrzne polecenia AHK:

Reload - przeładowuje skrypt (i w tym wypadku włącza capslocka, więc trzeba pacnąć go raz jeszcze żeby nie przeszkadzał), bardzo użyteczne gdy coś zmodyfikowaliście w skrypcie i potrzeba sprawdzić to w akcji,

Suspend - zawiesza działanie skryptu a ikonka w zasobniku zmienia się z "H" na "S",

ExitApp - to zamknięcie skryptu. I kropka.

Następny - Odcinek 7

Wybrane dla Ciebie
Komentarze (7)