AutoHotkey — często zadawane pytania

> Dodaj do ulubionych

Składnia języka

Kiedy polecenia i parametry należy ujmować w cudzysłów?

Podwójny prosty cudzysłów („) ma specjalne znaczenie tylko w wyrażeniach. W innych miejscach cudzysłowy te są traktowane jak zwykłe znaki. Kiedy jednak skrypt uruchamia program albo otwiera dokument, system operacyjny zazwyczaj wymaga, aby w cudzysłów ujęte były wszystkie parametry wiersza poleceń zawierające spacje, jak w poniższym przykładzie:

Run, Notepad.exe "C:Moje dokumentyAddress List.txt"

Kiedy nazwy zmiennych należy umieszczać między znakami procenta?

Nazwy zmiennych należy umieszczać między znakami procenta zawsze z wyjątkiem przypadków oznaczonych poniżej pogrubieniem:

  1. W parametrach będących zmiennymi wejściowymi lub wyjściowymi: StringLen, OutputVar, InputVar
  2. Po lewej stronie instrukcji przypisania: Var = 123abc
  3. Po lewej stronie tradycyjnych (nie będących wyrażeniami) instrukcji if: If Var1 < %Var2%
  4. Zawsze w wyrażeniach. Na przykład:
    If (Var1 <> Var2)
    Var1 := Var2 + 100
    

Kiedy należy stosować sekwencje zastępcze dla znaków procenta i przecinków?

Literalnie użyte znaki procenta należy zastępczo oznaczyć stawiając przed nimi znak odwrotnego apostrofu. Na przykład: MsgBox Aktualnie odsetek wynosi 25`%. Także przecinki użyte literalnie należy odpowiednio oznaczyć (`,). Wyjątkiem są okna MsgBox i ostatni parametr polecenia (w tym przypadku odwrotny apostrof jest dozwolony, ale nie wymagany).

Gdy przecinki i znaki procenta znajdują się w podwójnym prostym cudzysłowie w wyrażeniu, można je oznaczyć odwrotnym apostrofem, ale nie jest to obowiązkowe. Na przykład: Var := "15%"

Często wykonywane czynności

Dlaczego niektóre wiersze kodu moich skryptów nie są nigdy wykonywane?

Wszystkie instrukcje, które powinny zostać wykonane od razu po uruchomieniu skryptu należy umieścić na samym początku tego skryptu, a więc przed jakimkolwiek skrótem klawiszowym, skrótem łańcuchowym lub jakąkolwiek instrukcją Return. Szczegółowe informacje na ten temat znajdziesz w opisie sekcji automatycznego wykonywania instrukcji.

Ponadto pierwszy wiersz skrótu klawiszowego zawierającego więcej niż jeden wiersz kodu musi znajdować się pod definicją skrótu, a nie w tym samym wierszu co skrót. Na przykład:

#space::  ; Win+spacja
Run Notepad
WinWaitActive Bez tytułu — Notatnik
WinMaximize
return

Dlaczego polecenie Run nie może uruchomić mojej gry lub mojego programu?

Niektóre programy muszą być uruchamiane w swoich własnych katalogach (jeśli masz wątpliwości, to najlepiej trzymać się tej zasady). Na przykład: Run, %A_ProgramFiles%Jakiś programApp.exe, %A_ProgramFiles%Jakiś program

Jak pobrać wynik operacji wiersza poleceń?

Testy wskazują, że dzięki wykorzystaniu pamięci podręcznej, przechowywanie niewielkich porcji danych wynikowych w plikach tymczasowych może być bardzo wydajne. W istocie jeśli plik zostanie usunięty od razu po jego użyciu, to często nie zostaje on w ogóle zapisany na dysku. Na przykład:

RunWait %comspec% /c dir > C:My Temp File.txt
FileRead, VarToContainContents, C:My Temp File.txt
FileDelete, C:My Temp File.txt

Aby uniknąć użycia pliku tymczasowego (zwłaszcza jeśli danych wyjściowych jest dużo), można użyć CmdRet. Istnieje też niewielkie darmowe narzędzie cb.zip (4 KB), które pobiera do 512 KB danych wyjściowych poleceń i programów. Przechwycony tekst jest zapisywany w schowku, do którego można uzyskać dostęp w skrypcie przy użyciu zmiennej clipboard. Na przykład:

RunWait %comspec% /c dir | cb.exe
MsgBox %clipboard%

Jak za pomocą jednego skryptu zamknąć, wstrzymać lub zawiesić inny skrypt?

Poniżej znajduje się przykładowy skrypt, który zamyka inny skrypt:

DetectHiddenWindows On  ; Wykrywa ukryte główne okno skryptu.
SetTitleMatchMode 2  ; Pozwala uniknąć konieczności podawania pełnej ścieżki do pliku poniżej.
WinClose Nazwa skryptu.ahk - AutoHotkey  ; Wpisz nazwę własnego skryptu (wielkość liter jest rozróżniana).

Aby zawiesić lub wstrzymać wykonywanie innego skryptu, należy ostatni wiersz powyższego kodu zastąpić jednym z poniższych:

PostMessage, 0x111, 65305,,, Nazwa skryptu.ahk - AutoHotkey  ; Zawieszenie.
PostMessage, 0x111, 65306,,, Nazwa skryptu.ahk - AutoHotkey  ; Wstrzymanie.

Jak zatrzymać powtarzającą się czynność nie kończąc wykonywania skryptu?

Aby wstrzymać lub wznowić cały skrypt naciśnięciem klawisza, należy klawisz ten przypisać do polecenia Pause, jak w poniższym przykładzie:

^!p::Pause  ; Naciśnij kombinację Ctrl+Alt+P, aby wstrzymać wykonywanie. Naciśnij ponownie tę kombinację, aby wznowić wykonywanie.

Poniżej znajduje się przykładowy skrypt, który zatrzymuje lub uruchamia własną czynność powtarzającą się wewnątrz pętli. Innymi słowy naciśnięcie tego skrótu klawiszowego spowoduje uruchomienie pętli. Jego ponowne naciśnięcie spowoduje zatrzymanie tej pętli.

#MaxThreadsPerHotkey 3
#z::  ; Win+Z (zmień ten skrót na własny).
#MaxThreadsPerHotkey 1
if KeepWinZRunning  ; Sprawdzenie czy wątek już wykonuje pętlę znajdującą się pod spodem.
{
    KeepWinZRunning := false  ; Sygnał dla pętli wątku, aby zatrzymać działanie.
    return  ; Zakończenie tego wątku, aby wątek znajdujący się poniżej wznowił działanie i „zobaczył” zmianę dokonaną przez kod znajdujący się w wierszu powyżej.
}
; W przeciwnym razie:
KeepWinZRunning := true
Loop
{
    ; Cztery następne wiersze zawierają definicję powtarzalnej czynności (zmień ten kod na własny):
    ToolTip, naciśnij klawisze Win-Z jeszcze raz, aby wyłączyć błyskanie.
    Sleep 1000
    ToolTip
    Sleep 1000
    ; Poniższy kod pozostaw bez zmian.
    if not KeepWinZRunning  ; Użytkownik nakazał pętli zaprzestanie wykonywania ponownym naciśnięciem klawiszy Win-Z.
        break  ; Wyjście z tej pętli.
}
KeepWinZRunning := false  ; Zresetowanie w ramach przygotowania na następne naciśnięcie skrótu.
return

Jak zwiększyć wydajność AutoHotkey podczas grania w gry i w innych przypadkach, gdy jest duże obciążenie procesora?

Jeśli skróty klawiszowe lub instrukcje Click i Send działają zauważalnie wolniej niż normalnie podczas dużego obciążenia procesora, problem można rozwiązać poprzez zwiększenie priorytetu skryptu. W tym celu należy na początku skryptu umieścić następujący wiersz kodu:

Process, Priority, , High

Jak używać pomocy kontekstowej programu AutoHotkey w dowolnym edytorze?

Można skorzystać z tego skryptu utworzonego przez Rajata.

Jak wykryć zakończenie wczytywania strony internetowej?

W przypadku przeglądarki Internet Explorer najprawdopodobniej najpewniejszą metodą jest użycie DllCall i COM, jak zademonstrowano w temacie www.autohotkey.com/forum/topic19256.html. Zawartość pasków adresu i stanu można pobrać tak, jak zademonstrowano w temacie www.autohotkey.com/forum/topic19255.html.

Starsza, mniej niezawodna metoda: technika przedstawiona w poniższym przykładzie działa w przeglądarce Internet Explorer na większości stron. Podobna technika może działać także w innych przeglądarkach:

Run, www.yahoo.com
MouseMove, 0, 0  ; Zapobiega wyświetleniu w pasku stanu adresu, gdy użytkownik najedzie kursorem na łącze zamiast słowa „Zakończono”.
WinWait, Yahoo! -
WinActivate
StatusBarWait, Done, 30
if ErrorLevel
   MsgBox czas oczekiwania upłynął albo okno zostało zamknięte.
else
   MsgBox Wczytywanie strony zostało zakończone.

Jak porównywać daty i godziny oraz jak nimi manipulować?

Za pomocą polecenia EnvAdd można dodać lub odjąć dowolną liczbę dni, godzin, minut lub sekund do lub od łańcucha określającego czas w formacie YYYYMMDDHH24MISS. Poniżej znajduje się przykładowa instrukcja odejmująca siedem dni od podanego czasu:

EnvAdd, VarContainingTimestamp, -7, days

Aby sprawdzić ilość czasu dzielącego dwie daty lub godziny, należy użyć polecenia EnvSub, w którego opisie znajduje się też przykład jego użycia. Aktualny lokalny czas jest także przechowywany w zmiennej wbudowanej A_Now. Ponadto istnieje kilka innych wbudowanych zmiennych dat i czasu oraz dostępne jest polecenie FormatTime służące do tworzenia własnych łańcuchów daty i czasu.

Dlaczego polecenia Hotstrings, Send i Click nie działają w niektórych grach?

Niektóre gry używają biblioteki DirectInput na wyłączność. Efektem ubocznym tego może być ignorowanie wszystkich symulowanych naciśnięć klawiszy i zdarzeń myszy. Problem ten można spróbować rozwiązać na jeden z poniższych sposobów (albo przy użyciu ich kombinacji):

Jak sterować Winampem, nawet gdy nie jest aktywny?

Zobacz Automatyzacja Winampa.

Jak zmienić napisy na przyciskach okien MsgBox?

Tu jest przykład.

Skróty klawiszowe, skróty łańcuchowe i zmienianie definicji klawiszy

Jak sprawić, aby moje skróty klawiszowe i łańcuchowe były gotowe do użytku od razu po uruchomieniu komputera?

W menu Start znajduje się folder o nazwie Autostart. Jeśli umieścisz w nim skrót do swojego skryptu, to skrypt ten będzie uruchamiany wraz z systemem operacyjnym. Aby utworzyć nowy skrót:

  1. Znajdź plik skryptu, zaznacz go, a następnie naciśnij kombinację klawiszy Ctrl+C.
  2. Kliknij prawym przyciskiem myszy przycisk Start (albo ikonę systemu Windows) — najczęściej znajdujący się w lewym dolnym rogu ekranu — i kliknij pozycję Eksploruj wszystkich użytkowników.
  3. Przejdź do folderu Autostart w folderze Programy.
  4. Na pasku menu kliknij Edycja -> Wklej skrót. W folderze Autostart powinien pojawić się skrót do skryptu.

Mam problem z używaniem przycisków myszy w skrótach klawiszowych. Ktoś wie, jak temu zaradzić?

W systemach Windows 95/98/Me używanie skrótów myszy jest aktualnie niemożliwe. W innych systemach z używaniem lewego i prawego przycisku myszy nie powinno być problemu (np. "#LButton::" oznacza Win + lewy przycisk myszy). Analogicznie środkowy przycisk myszy i zdarzenie obracania kółkiem myszy powinny nadawać się do normalnego użytku z wyjątkiem myszy, których sterowniki bezpośrednio kontrolują te przyciski.

Czwartego (XButton1) i piątego (XButton2) przycisku myszy można używać, jeśli sterownik myszy udostępnia ich kliknięcia systemowi. Jeśli są one niewidoczne dla systemu — albo mysz ma więcej niż pięć przycisków, których chcesz użyć — można spróbować skonfigurować oprogramowanie dołączone do myszy (czasami dostępne w Panelu sterowania albo menu Start) i za jego pomocą wysyłać zdarzenia naciśnięcia przycisku w odpowiedzi na naciśnięcie jednego z tych przycisków. Następnie takie zdarzenie można zdefiniować jako skrót klawiszowy w skrypcie. Na przykład, jeśli czwarty przycisk myszy zostanie skonfigurowany do wysyłania zdarzenia Ctrl+F1, to przycisk ten można następnie pośrednio zdefiniować jako skrót klawiszowy za pomocą polecenia ^F1:: w skrypcie.

Jeśli masz mysz z pięcioma przyciskami, której czwarty i piąty przycisk jest niewidoczny, możesz spróbować wymienić jej sterownik na standardowy sterownik systemowy. Aby to było możliwe, oczywiście musi istnieć taki sterownik dla tej myszy oraz musisz radzić sobie bez dodatkowych funkcji dostępnych dzięki specjalnemu sterownikowi.

Jak zamienić klawisze spacji i tabulatora w klawisze skrótu?

Należy użyć nazw tych klawiszy (Tab i Space), a nie ich reprezentacji znakowych. Na przykład #Space oznacza Win+spacja, a ^!Tab oznacza Ctrl+Alt+Tab.

Jak zmienić definicje klawiszy klawiaturowych i przycisków myszy?

Informacje na ten temat znajdują się w części poświęconej zmienianiu definicji klawiszy.

Jak utworzyć skrót klawiszowy albo łańcuchowy na wyłączność wybranego programu? Innymi słowy, chcę aby wybrany klawisz działał w specyficzny sposób tylko w określonym oknie programu.

Preferowaną metodą jest użycie dyrektywy #IfWinActive. Na przykład:

#IfWinActive, ahk_class Notepad
^a::MsgBox Naciśnięto kombinację Ctrl+A, podczas gdy aktywne było okno Notatnika.

Windows 95/98/Me: mimo iż opisana metoda zadziała w tych systemach, to naciśnięcie kombinacji Ctrl+A w innym oknie niż Notatnika nie wywoła żadnej reakcji (nawet standardowej funkcji). Można to rozwiązać następująco:

$^a::Send ^a  ; Ten skrót klawiszowy musi być pierwszy w systemach Windows 9x. Przedrostek $ sprawia, że skrót może „wysłać samego siebie”.
#IfWinActive, ahk_class Notepad
^a::MsgBox Naciśnięto kombinację Ctrl+A, podczas gdy aktywne było okno Notatnika.

Jak sprawić, aby prefiksowy klawisz pełnij swoją normalną rolę, zamiast nic nie robić?

Rozważ poniższy przykład, w którym klawisz Numpad0 jest użyty jako przedrostek:

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

Aby klawisz Numpad0 wysyłał zdarzenie naciśnięcia klawisza Numpad0>, gdy nie jest używany jako klawisz skrótu, należy użyć następującego kodu:

 $Numpad0::Send, {Numpad0}

Przedrostek $ zapobiega wyświetleniu ostrzeżenia o nieskończonej pętli (które jest wyświetlane, ponieważ klawisz skrótu „wysyła sam siebie”). Dodatkowo powyższe zdarzenie ma miejsce w momencie zwolnienia tego klawisza.

Jak zmienić lub wyłączyć standardowe skróty systemu Windows, takie jak Win+U (Menedżer narzędzi) i Win+R (Uruchamianie)?

Tu można znaleźć kilka przykładów.

Na mojej klawiaturze znajduje się specjalny klawisz 000. Czy można go zamienić w skrót klawiszowy?

Tak, ale tylko w systemie Windows od wersji Windows NT. Ten przykładowy skrypt zamienia klawisz 000 w klawisz znaku równości. Można zmienić jego działanie zastępując kod "Send, =" własnym kodem.