AutoHotkeyの最も簡単で便利な機能の1つは、プログラムを起動するキーボードショートカット(ホットキー)を作成することができることです。
プログラムの起動は、Run関数を呼び出して、プログラムのコマンドラインをパラメータとして渡すことで行います:
Run "C:\Windows\notepad.exe"
この例では、メモ帳を起動します。試す方法は、「サンプルコードを実行する方法」を参照してください。
この段階では、ホットキー(言い換えれば、キーボードショートカットの割り当て)を定義していないので、すぐに指示が実行されます。この場合、スクリプトは他にすることがないので、自動的に終了します。学習しながら便利なホットキーを作りたい方は、まず「ホットキーの書き方」をご覧ください。
注:「実行」は、ドキュメント、フォルダ、URLを開くためにも使用できます。
他のプログラムを起動する場合は、上記の例のパスを起動したいプログラムのパスに置き換えるだけです。プログラムによってはパスがシステムに登録されているものもあり、その場合は拡張子「.exe」の有無にかかわらず、プログラムのファイル名だけを渡すことで対応できます(場合によっては拡張子「.exe」のないものもあります)。事例:
Run "notepad"
プログラムがコマンドラインパラメーターを受け付ける場合は、Run関数の最初のパラメーターの一部として渡すことができます。以下の例では、license.txtをメモ帳で開いているはずです:
Run "notepad C:\Program Files\AutoHotkey\license.txt"
注:この例では、AutoHotkeyがデフォルトの場所にインストールされていることを前提としていて、そうでないときはエラーが表示されます。
シンプルでしょう?ここで、メモ帳ではなく、WordPadでファイルを開きたいとします。
Run "wordpad C:\Program Files\AutoHotkey\license.txt"
このコードを実行し、その結果から何を学ぶことができるかを確認します。
なるほど、新しいコードは動かないんですね。エラーダイアログは、コーディングの過程では当たり前のことであり、非常に有用な情報が含まれていることが多いからです。この一枚で、いくつかのことがわかるはずだ:
しかし、なぜメモ帳が使えたのでしょうか?notepad」と「wordpad」のどちらかを単独で実行しても動作しますが、その理由は異なります。wordpad.exeはnotepad.exeと異なり、環境変数PATHに記載されている各ディレクトリを確認しても見つけることができない。別の方法で探すことも可能で、その場合はRun関数でプログラム名とパラメータを分離する必要があります。
そこで、この場合、Run関数には、次のような形で、ちょっとした手助けが必要です:
とりあえず、一番簡単な選択肢を選んでください:
Run "wordpad.exe C:\Program Files\AutoHotkey\license.txt"
これでWordPadは起動するのですが、エラーが表示されます:「C:\Program」は見つかりませんでした。
コマンドラインパラメーターをプログラムに渡す際、パラメーターにスペースが含まれている場合、各パラメーターを引用符で囲む必要があることがよくあります。これはメモ帳では必要なかったのですが、メモ帳は一般的な例外です。単純に引用符を増やせばいいという安直な発想で解決できるかもしれません:
Run "wordpad.exe "C:\Program Files\AutoHotkey\license.txt""
しかし、デフォルトでは、リテラルテキストの開始と終了を示すために引用符が使用されるため、これは機能しません。では、コマンドラインを終了させるのではなく、コマンドライン内にリテラルな引用符を入れるにはどうすればよいのでしょうか?
方法1:各リテラルの引用符の前に`
(バックティック、バッククオート、グレイブアクセント)を付ける。これをエスケープシーケンスと呼びます。このとき、引用符はコマンドライン(Run関数に渡される文字列)に含まれ、バックティックはその目的を果たした後、省かれる。
Run "wordpad.exe `"C:\Program Files\AutoHotkey\license.txt`""
方法2:コマンドラインをダブルクォーテーションではなく、シングルクォーテーションで囲む。
Run 'wordpad.exe "C:\Program Files\AutoHotkey\license.txt"'
もちろん、その場合、テキスト中の文字通りのシングルクォート(またはアポストロフィー)はエスケープ(`'
)する必要があります。
コードの書き方によって、どの引用符が実際に実行機能で処理されるかが変わります。上の2つの例では、Run関数がwordpad.exe "C:\Program Files\AutoHotkey\license.txt"
という文字列を受け取っています。Run機能は、これをプログラム名と パラメータ(それ以外のすべて)に分割するか、システムに委ねるかのどちらかです。いずれの場合も、残りの引用符がどのように解釈されるかは、ターゲットとなるプログラムに完全に依存します。
多くのプログラムでは、引用符の前にバックスラッシュがある場合、パラメータの一部として扱います。例えば、Run 'my.exe "A\" B'
は2つのパラメーターの代わりに値A" B
のパラメーターを生成するかもしれない。これはプログラム次第で、通常、Run 'my.exe "A\\" B'
のようにバックスラッシュを2重にすることで回避することが可能です。これは通常2つのパラメータ(A\
、B
)を生成します。
ほとんどのプログラムは、引用符を一種のトグルとして解釈し、「スペースはパラメーターを終了する」と「スペースはパラメーターに含まれる」の間でモードを切り替えます。つまり、Run 'my.exe "A B"'
は一般的に Run 'my.exe A" "B'
と同等です。そこで、スラッシュの問題を回避する別の方法として、Run 'my.exe "A"\ B'
のように、パラメータ全体ではなくスペースを引用するか、スラッシュの前で引用を終了します。
コマンドラインには、しばしばいくつかの変数を含める必要があります。例えば、"Program Files" ディレクトリの場所はシステムによって異なることがあり、スクリプトはA_ProgramFiles変数を使用することでこれを考慮することができます。変数にコマンドライン全体が含まれている場合は、その変数をRun関数に渡すだけで実行できます。
Run A_ComSpec ; コマンドプロンプト(ほとんどの場合cmd.exe)を起動します。 Run A_MyDocuments ; ユーザーのDocumentsフォルダを開く。
引用符で囲まれた文字列の中に変数を入れてもうまくいかないので、代わりに連結を使ってリテラル文字列と変数を連結します。事例:
Run 'notepad.exe "' A_MyDocuments '\AutoHotkey.ahk"'
Format関数で置換することもできます。事例:
Run Format('notepad.exe "{1}\AutoHotkey.ahk"', A_MyDocuments)
注:Formatは、0やスペースによるパディングや、数値を10進数ではなく16進数でフォーマットするなど、追加のフォーマットを同時に実行することができます。
実行するコマンドラインの他に、Run関数はその動作に影響を与えるいくつかのパラメータを受け付けます。
WorkingDirは、新しいプロセスの作業ディレクトリを指定します。プログラムに相対パスを指定した場合は、このディレクトリからの相対パスとなります。コマンドラインパラメータの相対パスもこのディレクトリからの相対パスであることが多いが、それはプログラムによって異なる。
Run "cmd", "C:\" ; コマンドプロンプトをC:\ に開きます。
オプションは、プログラムを画面にポップアップさせるのではなく、最小化または非表示にして実行するために使用できることが多いですが、プログラムによっては無視されることもあります。
OutputVarPIDはプロセスIDを与えるもので、WinWaitや WinWaitActive、ahk_pidとともに、プログラムが画面にウィンドウを表示するまで待つ、あるいはそのウィンドウの一つを特定するためによく使われます。事例:
Run "mspaint",,, &pid WinWaitActive "ahk_pid " pid Send "^e" ; Ctrl+Eはイメージのプロパティダイアログを開きます。
システム動詞とは、システムやアプリケーションが特定のファイルタイプに対して登録するアクションのことです。これらは通常、エクスプローラーのファイルの右クリックメニューで利用できますが、実際の名前はメニューに表示されるテキストと必ずしも一致しません。例えば、AutoHotkeyスクリプトには、スクリプトをエディタで開く「edit」動詞と、(Ahk2Exeがインストールされていれば)スクリプトをコンパイルする「compile」動詞があります。
"Edit "は、Runがデフォルトで認識する一般的な動詞のリストの1つで、次のように、単語の後にスペースとファイル名を書くだけで使用することができます:
Run 'edit ' A_ScriptFullPath ; 一般的にEditに相当します。
システムに登録されている動詞は、以下のように*接頭辞をつけることで実行することができます:
Run '*Compile-Gui ' A_ScriptFullPath
Ahk2Exeがインストール済のときは、現在のスクリプトがあらかじめ選択された状態でAhk2Exe Guiが開かれます。
新しいプロセスが起動すると、一般的にそのプロセスを起動したプロセス(親プロセス)の環境を引き継ぎます。これは基本的に、スクリプトの環境変数がすべて、Runで起動したプログラムに継承されることを意味します。
場合によっては、プログラムを起動する前にEnvSetで環境変数を設定し、プログラムの動作に影響を与えたり、情報を渡したりすることができます。また、スクリプトはEnvGetを使用して、親プロセスから継承した環境変数を読み込むことができます。
64ビットシステムでは、スクリプトを実行するEXEが32ビットか64ビットかに応じて、スクリプト自身の環境が大きく変化します。32ビットプロセスは、環境変数が異なるだけでなく、互換性のためにファイルシステムのリダイレクトが行われている。
Run "cmd /k set pro"
上の例では、"pro"で始まるすべての環境変数を表示するコマンドプロンプトを表示しています。32ビットスクリプトから実行した場合、PROCESSOR_ARCHITECTURE=x86
、ProgramFiles=C:\Program Files (x86)
と表示されると思います。タイトルは"C:\Windows\System32\cmd.exe"ですが、これは嘘で、本当は "C:\Windows\SysWow64\cmd.exe"にある32ビット版なのです。
このような単純なケースでは、"System32" のリダイレクトを回避する最も簡単な方法は、代わりに"SysNative" を使用することです。ただし、これは64ビットシステム上の32ビットプロセスからしか動作しないので、条件付きで行う必要があります。以下の例を64ビットシステムで実行すると、スクリプトが32ビットであっても、64ビットのコマンドプロンプトが表示されます:
if FileExist(A_WinDir "\SysNative") Run A_WinDir "\SysNative\cmd.exe /k set pro" else Run "cmd /k set pro"