スクリプト

関連トピック

目次

はじめに

各スクリプトは、プログラム(AutoHotkey.exe)によって実行される行を含むプレーンテキストファイルです。スクリプトには、ホットキーホットストリングが含まれることもありますし、それらだけで構成されることもあります。しかし、ホットキーやホットストリングがない場合、スクリプトは起動した瞬間に上から下へと順次機能を実行する。

プログラムはスクリプトを一行ずつメモリにロードする。ロード中、スクリプトは最適化され、検証される。構文エラーはすべて表示され、スクリプトを実行する前に修正する必要があります。

スクリプトの起動(自動実行スレッド)

スクリプトが読み込まれた後、自動実行スレッドは、スクリプトの先頭行で実行を開始し、ReturnExitAppExitなどの停止指示があるまで実行を続ける。スクリプトの物理的な端は、Exitとしても機能します。

ホットキーホットストリング、表示可能なGUI、アクティブタイマークリップボードモニターInputHooksがなく、Persistent関数を呼び出していない場合、スクリプトは起動完了後に終了します。Otherwise, it will stay running in an idle state, responding to events such as hotkeys, hotstrings, GUI events, custom menu items, and timers. 起動完了後にこれらの条件が変更された場合(たとえば、最後のタイマーが無効になった場合)、最後に実行されたスレッドが完了するか、最後のGUIが閉じると、スクリプトが終了することがあります。

新しいスレッドがホットキーホットストリングタイマー、その他のイベントによって)起動されるたびに、以下の設定が自動実行スレッドからコピーされます。自動実行スレッドによって設定されていない場合は、標準のデフォルトが適用される(以下の各ページに記載):CoordMode, Critical, DetectHiddenText, DetectHiddenWindows, FileEncoding, ListLines, SendLevel, SendMode, SetControlDelay, SetDefaultMouseSpeed, SetKeyDelay, SetMouseDelay, SetRegView, SetStoreCapsLockMode, SetTitleMatchMode, SetWinDelay, and Thread.

スレッドは上記の設定のコレクションを保持するため、これらの設定を変更しても他のスレッドには影響しない。

上記の関数の「デフォルト設定」とは、通常、自動実行スレッドの現在の設定を指し、プログラム定義のデフォルト設定と同じように開始される。

伝統的に、スクリプトの最上部は自動実行セクションと呼ばれてきた。しかし、自動実行スレッドはスクリプトの先頭だけに限定されるわけではない。自動実行スレッドで呼び出される関数も、デフォルト設定に影響を与える可能性がある。ディレクティブや関数、ホットキー、ホットストリング、クラス定義は、実行中に遭遇するとスキップされるため、起動コードを各ファイル全体に配置することが可能です。例えば、ホットキーのグループで使用されるグローバル変数は、スクリプトの先頭ではなく、それらのホットキーの上(または下)で初期化することができます。

長い線を短い線に分割する

長い行を小さな行の集まりに分割することで、読みやすさと保守性を向上させることができる。このような行は、スクリプトが起動した瞬間にメモリ上にマージされるため、スクリプトの実行速度が低下することはない。

3つの方法があり、一般的に組み合わせて使うことができる:

継続演算子:カンマまたはその他の式演算子(++と--を除く)で始まる行は、その直上の行に自動的にマージされる。同様に、式演算子で終わる行は、自動的にその下の行にマージされる。次の例では、2行目はコンマで始まっているため、1行目に追加される:

FileAppend "This is the text to append.`n"   ; A comment is allowed here.
    , A_ProgramFiles "\SomeApplication\LogFile.txt"  ; Comment.

同様に、次の2行は "and"または "or"で始まるので、1行にまとめられる:

if Color = "Red" or Color = "Green"  or Color = "Blue"   ; Comment.
    or Color = "Black" or Color = "Gray" or Color = "White"   ; Comment.
    and ProductIsAvailableInColor(Product, Color)   ; Comment.

三項演算子も良い候補である:

ProductIsAvailable := (Color = "Red")
    ? false  ; We don't have any red products, so don't bother calling the function.
    : ProductIsAvailableInColor(Product, Color)

以下の例は上記と同等である:

FileAppend "This is the text to append.`n",   ; A comment is allowed here.
    A_ProgramFiles "\SomeApplication\LogFile.txt"  ; Comment.

if Color = "Red" or Color = "Green"  or Color = "Blue" or   ; Comment.
    Color = "Black" or Color = "Gray" or Color = "White" and   ; Comment.
    ProductIsAvailableInColor(Product, Color)   ; Comment.

ProductIsAvailable := (Color = "Red") ?
    false : ; We don't have any red products, so don't bother calling the function.
    ProductIsAvailableInColor(Product, Color)

上の例で使われているインデントは任意だが、どの行がその上の行に属するかを示すことで、より明瞭になるかもしれない。また、上記の例の行間や行末に空行やコメントを追加してもよい。

継続演算子は、自動置換ホットストリングや#HotIf以外のディレクティブでは使用できません。

囲みによる継続:ある行に式や関数・プロパティの定義があり、その定義が閉じていない(/[/{場合、開閉記号の数が釣り合うまで後続の行と結合される。言い換えれば、括弧、ブラケット、ブレースで囲まれた部分式は、ほとんどの場合、自動的に複数行にまたがることができる。事例:

myarray := [
  "item 1",
  "item 2",
]
MsgBox(
    "The value of item 2 is " myarray[2],
    "Title",
    "ok iconi"
    )

継続表現は両方のタイプのコメントを含むことができる。

継続表現は通常の継続セクションを含むことができる。したがって、式を含むすべての行と同様に、エスケープされていない開括弧(()で始まる行は、同じ行に閉括弧()がない限り、継続セクションの開始とみなされる。

引用符で囲まれた文字列は、この方法だけでは複数行にまたがることはできない。ただし、上記を参照のこと。

囲みによる継続は、継続演算子と組み合わせることができる。事例:

myarray :=  ; The assignment operator causes continuation.
[  ; Brackets enclose the following two lines.
  "item 1",
  "item 2",
]

行末のブレース({)は、オブジェクト・リテラルの開始ではなく、ブロックの開始(OTBスタイル)として解釈されるべきであるとプログラムが判断した場合、継続を引き起こさない。具体的には(優先順位の高い順に):

中括弧は、本文を必要としない関数呼び出し、式、制御フロー文であれば、行の継続のために安全に使うことができる。事例:

myfn() {
    return {
        key:"value"
    }
}

継続セクション:この方法は、多数の行を統合する場合や、行が他の方法に適さない場合に使用する。このメソッドは自動置換ホットストリングに特に有効ですが、どんなにも使えます。事例:

; EXAMPLE #1:
Var := "
(
A line of text.
By default, the hard carriage return (Enter) between the previous line and this one will be stored.
	This line is indented with a tab; by default, that tab will also be stored.
Additionally, "quote marks" are automatically escaped when appropriate.
)"

; EXAMPLE #2:
FileAppend "
(
Line 1 of the text.
Line 2 of the text. By default, a linefeed (`n) is present between lines.
)", A_Desktop "\My File.txt"

上記の例では、一連の線は上下に括弧で囲まれている。これは継続区間として知られている。閉じ括弧の後のコードも(区切り記号なしで)他の行と結合されるが、開き括弧と閉じ括弧は含まれないことに注意。

継続セクションの上の行が名前文字で終わっており、そのセクションが引用符で囲まれた文字列で始まっていない場合、名前と継続セクションの内容を区切るために、1つのスペースが自動的に挿入される。

上記の例のように、引用符で囲まれた文字列の中で継続セクションが始まる場合、引用符は自動的にエスケープされる(つまり、リテラル文字として解釈される)。それ以外の場合、引用符は通常と同じように機能する。つまり、継続セクションは引用符で囲まれた文字列を含むことができる。

デフォルトでは、継続セクション内の最初の行のインデントに基づいて、先頭のスペースやタブが省略される。最初の行にスペースとタブが混在している場合、最初の種類の文字だけがインデントとして扱われます。もし、ある行が最初の行より小さくインデントされたり、間違った文字でインデントされた場合、その行のすべての先頭の空白はそのまま残されます。

By default, trailing spaces or tabs are omitted.

継続セクションのデフォルトの動作は、セクションの開始括弧の右側に以下のオプションを1つ以上含めることで上書きすることができる。複数のオプションがある場合は、それぞれをスペースで区切る。事例:( LTrim Join|.

JoinString: Specifies how lines should be connected together. If this option is not used, each line except the last will be followed by a linefeed character (`n). If String is omitted, lines are connected directly to each other without any characters in between. Otherwise, specify for String a string of up to 15 characters. For example, Join`s would insert a space after each line except the last. Another example is Join`r`n, which inserts CR+LF between lines. Similarly, Join| inserts a pipe between lines. To have the final line in the section also ended by String, include a blank line immediately above the section's closing parenthesis.

LTrim:各行の先頭のスペースとタブをすべて削除する。デフォルトの "スマート"な振る舞いのため、これは通常不要である。

LTrim0(LTrimの後に0が続く):行頭のスペースとタブの省略をオフにする。

RTrim0(RTrimの後に0が続く):行末のスペースとタブの省略をオフにする。

Comments (または Comment または Com または C):継続セクション内でのセミコロン・コメントを許可する(ただし/*..*/は不可)。そのようなコメントは(その左にあるスペースやタブとともに)、リテラルテキストとして扱われるのではなく、結合結果から完全に省略される。各コメントは、行の右側に表示することも、それ自体で改行することもできる。

` (accent):各バックティック文字をエスケープ文字としてではなく、文字通りに扱う。また、`r`tのような明示的に指定されたエスケープシーケンスも変換されなくなる。

( または ):最初の開始括弧の右側に開始括弧または閉じ括弧がある場合(Joinオプションのパラメータを除く)、その行は継続セクションの開始ではなく、式として再解釈される。これにより、(x.y)[z]()のような式を行頭で使用できるようになり、また、複数行の式(((MyFunc(のように行で始めることもできる。

備考

`n (改行) や `t (タブ) などのエスケープシーケンスは、アクセント (`) オプションが指定されている場合を除き、継続セクションの内部でサポートされています。

commentオプションがない場合、セミコロンと/*..*/コメントは、リテラルテキストとみなされるため、継続セクションの内部ではサポートされない。ただし、セクションの最下行と最上行にコメントを入れることができる。事例:

FileAppend "   ; Comment.
; Comment.
( LTrim Join    ; Comment.
     ; This is not a comment; it is literal. Include the word Comments in the line above to make it a comment.
)", "C:\File.txt"   ; Comment.

上記の結果、セミコロンを継続セクション内でエスケープする必要はない。

閉じ括弧は継続セクションの終わりを示すので、リテラルな閉じ括弧で行を開始するには、その前にアクセント記号/バックチックを付ける:`). ただし、アクセント(`)オプションとの併用はできない。

継続セクションの直後に、別の継続セクションの開括弧を含む行を続けることができる。これにより、1つのラインを構築する過程で、上記のオプションを変化させることができる。

Includeによる継続セクションの断片的な構築はサポートされていない。

スクリプトライブラリフォルダ

ライブラリフォルダは、#Includeによって他のスクリプトが利用する共有スクリプトを保管するための、いくつかの標準的な場所を提供する。ライブラリ・スクリプトには通常、このように使用・再利用されるように設計された関数やクラスが含まれている。ライブラリスクリプトをこれらの場所のいずれかに置くと、他の人と共有でき、複数のセットアップで動作するスクリプトを簡単に書くことができます。図書館の場所は以下の通り:

A_ScriptDir "\Lib\"  ; Local library.
A_MyDocuments "\AutoHotkey\Lib\"  ; User library.
"directory-of-the-currently-running-AutoHotkey.exe\Lib\"  ; Standard library.

ライブラリフォルダは上記の順序で検索されます。

例えば、スクリプトに#Include<MyLib>という行が含まれていると、プログラムはローカル・ ライブラリから「MyLib.ahk」という名前のファイルを探す。そこで見つからなければ、ユーザー・ライブラリーを探し、次に標準ライブラリーを探す。それでも一致するものが見つからず、ライブラリ名にアンダースコア(例:MyPrefix_MyFunc)が含まれている場合、プログラムは接頭辞(例:MyPrefix.ahk)だけで再度検索を行います。

通常、ライブラリ・ファイルには、ファイル名と同じ名前の関数やクラスが1つだけ含まれるのが通例だが、そのファイルによってのみ呼び出されるプライベート関数が含まれることもある。しかし、このような関数は、グローバル名前空間に存在するため、かなり明確な名前を持つ必要がある。

スクリプトをEXEに変換 (Ahk2Exe)

A script compiler (courtesy of fincs, with additions by TAC109) is available as a separate automatic download.

つまり、スクリプトを実行するためにAutoHotkey.exeは必要ありません。コンパイル・プロセスは、以下を含む実行可能ファイルを作成する:AutoHotkeyインタープリタ、スクリプト、スクリプトに含まれるファイル、FileInstall関数で取り込んだファイル。コンパイラのディレクティブを使って、追加ファイルをインクルードすることができる。

v1.1とv2のスクリプトには同じコンパイラが使用される。コンパイラーは、提供されたベースファイルのメジャーバージョンをチェックすることで、スクリプトのバージョンを区別する。

コンパイラ・トピックス

コンパイラの実行

Ahk2Exeは次のような使い方ができます:

注:

コンパイラーのソースコードと新しいバージョンはGitHubで見ることができる。

基本実行ファイル

コンパイルされた各スクリプト.exeは、インタプリタを実装した実行ファイルをベースにしている。Compilerディレクトリに含まれる基本ファイルの拡張子は".bin "である。これらは、外部スクリプトファイルを読み込む機能を含まないバージョンのインタープリターである。代わりに、プログラムは">AUTOHOTKEY SCRIPT<"という名前のWin32 (RCDATA)リソースを探し、それをロードするか、見つからなければ失敗する。

標準のAutoHotkey実行ファイルは、ID 1のWin32 (RCDATA)リソースを埋め込むことで、コンパイル済みスクリプトのベースとして使用することもできます。(追加のスクリプトはAddResourceコンパイラディレクティブで追加できます。) これにより、コンパイルされたスクリプト.exeを/scriptスイッチで使用し、メインの埋め込みスクリプト以外のスクリプトを実行することができます。詳しくは埋め込みスクリプトをご覧ください。

スクリプト・コンパイラ・ディレクティブ

スクリプトコンパイラディレクティブは、スクリプトのコンパイル方法の詳細を指定します。いくつかの特徴を挙げよう:

詳しくはスクリプト・コンパイラ・ディレクティブを参照してください。

コンパイル済みスクリプトの圧縮

Ahk2Exeはコンパイルされたスクリプトを圧縮するためにMPRESSまたはUPXフリーウェアをオプションで使用します。MPRESS.exeおよび/またはUPX.exeがAutoHotkeyがインストールされた "Compiler"サブフォルダにコピーされている場合、/compressパラメータまたはGUI設定の指示に従い、どちらかを使用して.exeを圧縮することができます。

MPRESS公式サイト(ダウンロードと情報):http://www.matcode.com/mpress.htm
MPRESS mirror: https://www.autohotkey.com/mpress/

UPX公式サイト(ダウンロードと情報):https://upx.github.io/

注意:スクリプトの実行ファイルを圧縮すると、メモ帳のようなプレーンテキストエディタやPEリソースエディタを使って、スクリプトのソースコードを気軽に閲覧することができなくなりますが、そのような目的に特化したツールによってソースコードが抽出されることは防げません。

背景情報

以下のフォルダ構成がサポートされており、実行バージョンのAhk2Exe.exeは、以下に示す1つ目の \compilerディレクトリにあります:

\AutoHotkey 
   AutoHotkeyA32.exe 
   AutoHotkeyU32.exe
   AutoHotkeyU64.exe
   \Compiler
      Ahk2Exe.exe  ; the master version of Ahk2Exe
      ANSI 32-bit.bin
      Unicode 32-bit.bin
      Unicode 64-bit.bin
   \AutoHotkey v2.0-a135
      AutoHotkey32.exe
      AutoHotkey64.exe
      \Compiler
   \v2.0-beta.1
      AutoHotkey32.exe
      AutoHotkey64.exe

ベースファイル検索アルゴリズムは、Ahk2Exeの起動時に短時間実行され、以下のように動作します:

修飾されたAutoHotkeyの.exeファイルとすべての.binファイルは、コンパイラのディレクトリ、コンパイラの親ディレクトリ、およびAutoHotkeyまたはVで始まり、AutoHotkey_Hで始まらないディレクトリ名を持つコンパイラの兄弟ディレクトリで検索されます。選択されたディレクトリは再帰的に検索される。検出されたAutoHotkey.exeファイルは除外され、AutoHotkeyA32.exe、AutoHotkey64.exeなどのファイルと、検出されたすべての.binファイルが残ります。含まれるすべての.exeファイルは、AutoHotkeyで始まる名前と、AutoHotkeyという単語を含むファイル説明が必要で、バージョンは1.1.34+または2.0-a135+でなければなりません。

コンパイルを成功させるには、AutoHotkeyインタプリタのバージョンも(ユーティリティとして)必要で、同様のアルゴリズムで選択されます。ほとんどの場合、使用されるインタープリターのバージョンは、ユーザーがコンパイル用に選択したベースファイルのバージョンと一致する。

スクリプトにコマンドラインパラメータを渡す

スクリプトはコマンドラインパラメーターをサポートする。形式:

AutoHotkey.exe [Switches] [Script Filename] [Script Parameters]

また、コンパイルされたスクリプトの場合、フォーマットは次のようになる:

CompiledScript.exe [Switches] [Script Parameters]

スイッチ:以下のうち0個以上:

Switch意味Works compiled?
/force 無条件に起動し、警告ダイアログをスキップする。これは#SingleInstance Offと同じ効果を持つ。 Yes
/restart スクリプトが再起動され、スクリプトの以前のインスタンスを閉じようとしていることを示す(これは、内部的にReload関数でも使用される)。 Yes
/ErrorStdOut

/ErrorStdOut=Encoding

スクリプトの起動を妨げる構文エラーを、ダイアログを表示するのではなく、標準エラーストリーム(stderr)に送る。詳細は#ErrorStdOutを参照。

オプションでエンコーディングを指定することもできる。例えば、/ErrorStdOut=UTF-8は、標準エラー出力に書き込む前にメッセージをUTF-8にエンコードする。

No
/Debug デバッグ・クライアントに接続する。詳細はインタラクティブ・デバッグを参照。 No
/CPn

スクリプトファイルの読み込みに使われるデフォルトのコードページを上書きする。詳細はスクリプトファイルのコードページを参照。

No
/Validate

AutoHotkeyはスクリプトをロードし、実行せずに終了します。

デフォルトでは、ロードタイムエラーと警告は通常通り表示される。ErrorStdOutスイッチを使用すると、エラーメッセージを抑止またはキャプチャすることができる。

プロセスの終了コードは、スクリプトのロードに成功した場合は0、エラーが発生した場合は0以外となる。

No
/iLib "OutFile"

Deprecated: Use /validate instead.

AutoHotkeyはスクリプトをロードしますが、実行しません。以前のバージョンのAutoHotkeyでは、自動インクルードされたファイルのファイル名は、#Includeディレクティブとしてフォーマットされ、OutFileで指定されたファイルに書き込まれました。

出力ファイルが存在する場合は上書きされる。OutFile*標準出力に出力を書き出す。

スクリプトに構文エラーが含まれている場合、出力ファイルは空になることがあります。シンタックス・エラーの場合、終了コードは2である。/ErrorStdOutスイッチを使用すると、エラーメッセージを表示しないことも、表示することもできる。

No
/include "IncFile"

メインスクリプトの前にファイルを含む。このメソッドでインクルードできるファイルは1つだけです。スクリプトがリロードされると、このスイッチは自動的に新しいインスタンスに渡される。

No
/script

.exeファイルに基づいてコンパイルされたスクリプトで使用する場合、このスイッチは、プログラムがメインの埋め込みスクリプトを無視するようにします。これにより、コンパイルされたスクリプト.exeは、メインスクリプト以外の外部スクリプトファイルや埋め込みスクリプトを実行できるようになる。コンパイル済みスクリプトでは通常サポートされていないその他のスイッチも使用できるが、このスイッチの右側に記載する必要がある。事例:

CompiledScript.exe /script /ErrorStdOut MyScript.ahk "Script's arg 1"

現在の実行ファイルにスクリプトが埋め込まれていない場合、このスイッチは許可されるが、何の効果もない。

このスイッチは、.binファイルに基づいてコンパイルされたスクリプトではサポートされていません。

こちらもご覧ください:Base Executable File (Ahk2Exe)

N/A

スクリプトファイル名: スクリプトパラメータがない場合は省略可能。省略した場合は、AutoHotkey実行ファイルのパスと名前がデフォルトになり、".exe"は".ahk"に置き換えられます。たとえば、AutoHotkey.exeの名前をMyScript.exeに変更すると、MyScript.ahkをロードしようとします。パラメータなしでAutoHotkey32.exeを実行すると、AutoHotkey32.ahkをロードしようとします。

ファイル名にアスタリスク(*)を指定すると、スクリプトのテキストを標準入力(stdin)から読み込む。これによって、以下のことも有効になる:

例についてはExecScript()を参照。

現在の実行ファイルにスクリプトが埋め込まれている場合、このパラメータには、アスタリスクの後に埋め込みスクリプトのリソース名またはIDを付けることができる。コンパイル済みスクリプトの場合(つまり、ID #1の埋め込みスクリプトが存在する場合)、このパラメータの前に/scriptスイッチを付ける必要があります。

スクリプトのパラメータ:スクリプトに渡す文字列を、空白で区切って指定します。スペースを含むパラメータは引用符で囲む。空文字列をパラメータとして渡したい場合は、連続する2つの引用符を指定する。リテラル引用符は、その前にバックスラッシュ( \")を付けることで渡すことができる。その結果、引用符で囲まれたパラメータ("C:\My Documents\"など)の末尾のスラッシュは、リテラル引用符として扱われます(つまり、スクリプトは "C:\My Documents"という文字列を受け取ります)。このような引用符を削除するには、A_Args[1] :=StrReplace(A_Args[1], '"')を使用する。

入力パラメータがある場合は、組み込み変数A_Argsに配列として格納され、配列構文を使ってアクセスできる。A_Args[1]は最初のパラメーターを含む。以下の例では、渡されるパラメーターが少なすぎる場合にスクリプトを終了している:

if A_Args.Length < 3
{
    MsgBox "This script requires at least 3 parameters but it only received " A_Args.Length "."
    ExitApp
}

スクリプトに渡されるパラメータの数がさまざまな場合(おそらく、ユーザーが一連のファイルをスクリプトにドラッグ&ドロップしたため)、次の例を使用して、パラメータを1つずつ抽出することができます:

for n, param in A_Args  ; For each parameter:
{
    MsgBox "Parameter number " n " is " param "."
}

パラメータがファイル名の場合、以下の例を使用すると、完全/絶対パスを含め、(ファイルシステムに保存されている)大文字/小文字を補正した長い名前に変換することができる:

for n, GivenPath in A_Args; 各パラメータ(またはスクリプトにドロップされたファイル):
{
    Loop Files, GivenPath, "FD"  ;ファイルやディレクトリをインクルードします。
        LongPath := A_LoopFileFullPath
    MsgBox "The case-corrected long path name of file`n" GivenPath "`nis:`n" LongPath
}

スクリプトファイルのコードページ

ASCII以外の文字をファイルから正しく読み取るには、ファイルが保存されたときに使用されたエンコーディング(通常はテキストエディタ)と、AutoHotkeyがファイルを読み取るときに使用するエンコーディングが一致している必要があります。一致しない場合、文字は正しくデコードされない。AutoHotkeyは以下のルールを使用して、使用するエンコーディングを決定します:

これは、AutoHotkeyによってロードされたスクリプトファイルにのみ適用され、スクリプト自体のファイルI/Oには適用されないことに注意してください。FileEncodingは、スクリプトが読み書きするファイルのデフォルトエンコーディングを制御し、IniReadIniWriteは常にUTF-16またはANSIで処理する。

すべてのテキストは(必要に応じて)ネイティブの文字列形式に変換されるため、無効な文字やネイティブのコードページに存在しない文字はプレースホルダーに置き換えられます:'�'. これは、スクリプトファイルにエンコーディングエラーがあるか、ファイルの保存と読み込みに使用されたコードページが一致しない場合にのみ発生するはずです。

RegWriteは、エクスプローラーから起動したスクリプトのデフォルトを設定するために使用することができる(ファイルをダブルクリックするなど):

; Uncomment the appropriate line below or leave them all commented to
;   reset to the default of the current build.  Modify as necessary:
; codepage := 0        ; System default ANSI codepage
; codepage := 65001    ; UTF-8
; codepage := 1200     ; UTF-16
; codepage := 1252     ; ANSI Latin 1; Western European (Windows)
if (codepage != "")
    codepage := " /CP" . codepage
cmd := Format('"{1}"{2} "%1" %*', A_AhkPath, codepage)
key := "AutoHotkeyScript\Shell\Open\Command"
if A_IsAdmin    ; Set for all users.
    RegWrite cmd, "REG_SZ", "HKCR\" key
else            ; Set for current user only.
    RegWrite cmd, "REG_SZ", "HKCU\Software\Classes\" key

これは、AutoHotkeyがすでにインストールされていることを前提としています。そうでない場合、結果は理想的とは言えないかもしれない。

スクリプトのデバッグ

ListVarsPauseなどの組み込み関数は、スクリプトのデバッグに役立ちます。たとえば、次の2行を注意深く選んだ位置に一時的に挿入すると、スクリプトに「ブレークポイント」ができる:

ListVars
Pause

スクリプトがこの2行に出会うと、すべての変数の現在の内容が表示され、閲覧できるようになる。再開の準備ができたら、ファイルメニューまたはトレイメニューからスクリプトの一時停止を解除する。スクリプトは、次の「ブレークポイント」に達するまで続けられる(もしあれば)。

一般的に、これらの「ブレークポイント」は、WinActivate関数の直前など、スクリプトにとってアクティブウィンドウが重要でない位置に挿入するのがベストである。これにより、一時停止を解除したときにスクリプトが適切に動作を再開する。

以下の関数もデバッグに役立つ:ListLines, KeyHistory, および OutputDebug.

タイプミスや「グローバル」宣言の欠落など、よくあるエラーのいくつかは、警告を有効にすることで検出できる。

インタラクティブ・デバッグ

サポートされているDBGpクライアントがあれば、インタラクティブなデバッグが可能です。通常、以下のようなアクションが可能である:

この機能は、BINファイルに基づいてコンパイルされたスクリプトには無効であることに注意してください。EXEファイルに基づいてコンパイルされたスクリプトの場合、/scriptの後に/debugを指定する必要があります。

対話型デバッグを有効にするには、まずサポートされているデバッガークライアントを起動し、/Debugコマンドラインスイッチを使用してスクリプトを起動します。

AutoHotkey.exe /Debug[=SERVER:PORT] ...

SERVERPORTは省略できる。例えば、以下は同等である:

AutoHotkey /Debug "myscript.ahk"
AutoHotkey /Debug=localhost:9000 "myscript.ahk"

すでに実行中のスクリプトにデバッガーをアタッチするには、以下のようにメッセージを送る:

ScriptPath := "" ; SET THIS TO THE FULL PATH OF THE SCRIPT
A_DetectHiddenWindows := true
if WinExist(ScriptPath " ahk_class AutoHotkey")
    ; Optional parameters:
;   wParam  = the IPv4 address of the debugger client, as a 32-bit integer.
;   lParam  = the port which the debugger client is listening on.
    PostMessage DllCall("RegisterWindowMessage", "Str", "AHK_ATTACH_DEBUGGER")

デバッガークライアントが接続されたら、"detach" DBGp コマンドを送信することで、スクリプトを終了せずにデタッチすることができる。

スクリプト・ショーケース

便利なスクリプトはこちらのページを参照。