のら(NORA)のブログ

主にソフトについて備忘録で(手抜き)書いているのです!ご自由に観覧しやがれ、です。

autohotkey2.0勉強中(翻訳)その4-2(スクリプト編その2)

スクリプト編(その2)

その1はこちら

スクリプトの起動とAuto-execute(自動実行)セクション(以下自動実行セクション)

  • スクリプトは読み込み時に解析され最適化される
    • これにより思ったように動作しないこともありそう、そんなことないかもね
  • スクリプトの文法エラーは読み込み時にチェックされ、修正されるまでプログラムを実行できない(例外あり)
  • スクリプトが読み込まれると、Return、Exit、ホットキー、ホットストリング、スクリプトの終わりのいずれかに達するまで自動で実行される
  • この部分(スクリプトが自動実行される範囲)のことを、自動実行セクションと呼ぶ
  • ホットキー、ホットストリング、、Lock系キーの固定などで常駐状態にされない場合、自動実行セクションが終了したらスクリプトは終了する
  • 上記以外の場合は、ホットキー、ホットストリング、GUIイベント、カスタムメニュー項目、タイマーなどのイベントに応答して、待機(アイドル)状態で動作し続ける
  • 自動実行セクションの完了後にこれらの条件が変更された場合や、(たとえば、最後のタイマーが無効になった場合)、最後に実行されたスレッドが完了するか、最後のGUIが終了すると、スクリプト(自動実行セクション)が終了する
  • ホットキー、ホットストリングなどがある場合はプログラムはそのまま駐屯する(待機状態になる)

自動実行セクションが終了しない例

  • ホットキー
  • ホットストリング
  • 可視GUI(アクティブなGUI)
  • アクティブなメッセージモニタ
  • タイマー
  • OnClipboardChangeコールバック関数
  • カスタムトレイメニュー項目
  • および#Persistent指令(ディレクトリ)
  • Lock系キーの固定
ホットキー、カスタムメニューアイテム、タイマーで起動されるスレッドでは、下記に記載するコマンドでの設定はそれぞれ独立している
  • これらの初期値は自動実行セクション内で設定できる
  • 設定が行われる前にスレッドが呼び出されると、期待した動作にならないことがあるので、自動実行セクションのできるだけ最初の方で設定しよう
  • 自動実行セクションが完了するまでに長い時間がかかる場合(または完了しない場合)、設定のデフォルト値は100ミリ秒後に有効になる - 長い時間ってどんぐらいなんだよっていうまあいいや
  • デフォルトでは自動実行セクションが完了すると、下記の設定は再度初期値に更新される。
  • だからホットキー、ホットストリング、タイマー、またはカスタムメニュー項目を含むスクリプトの一番上でデフォルト値を変更するのがいい
  • これらの設定に加えられた変更は、他のスレッドには影響しない

実行時に設定が初期化される該当コマンド設定一覧(詳細はまた今度)

  • DetectHiddenWindows
  • DetectHiddenText
  • SetTitleMatchMode
  • SetBatchLines
  • SetKeyDelay
  • SetMouseDelay
  • SetWinDelay
  • SetControlDelay
  • SetDefaultMouseSpeed
  • Thread attributes
  • CoordMode
  • SetStoreCapslockMode
  • AutoTrim
  • SetFormat
  • StringCaseSense

プログラムのコマンドライン引数

AutoHotkeyコマンドラインの書式は以下の通り
* AutoHotkey.exe [Switches] [Script Filename] [Script Parameters] * CompiledScript.exe [Switches] [Script Parameters]

[Switches] には以下のものを指定もしくは入力なし

コンパイル後でも使えるもの

  • /f(または/force):警告ダイアログを出さずに、強制的に起動
    • #SingleInstance Offと同じ効果
  • /r(または/restart):スクリプトを再読み込みしたいときに使用
  • /ErrorStdOut:文法エラーをダイアログ表示せずに標準出力に出力する
    • 詳細については「#ErrorStdOut」を参照(後ほど)
    • これを/iLibと組み合わせて、スクリプトを実行せずに検証することができる コンパイル後では使えないもの
  • /Debug:デバッグクライアントに接続する
    • 詳細については、「対話型デバッグ」を参照(後ほど)
  • /CP「n」:スクリプトファイルの読み取りに使用されるデフォルトの文字コードを上書きする
  • /iLib “Outfile” AutoHotkeyスクリプトをロードしますが、実行せず、ライブラリ機構を介して自動的にインクルードされるスクリプトファイルごとに、OutFileで指定されたファイルに2行づつ書き込まれる
  • これらの行は、次の形式で記述される
LibDirはLibフォルダのフルパスで、LibFileはライブラリのファイル名  
\#Include LibDir\  
\#IncludeAgain LibDir\LibFile.ahk
  • 出力ファイルが既に存在する場合は上書きされる
  • OutFileは、"の代わりに*で囲むと標準出力(stdout{standardout})できる
    • 詳細は「標準出力」を参照(後ほど)
  • スクリプトに構文エラーが含まれていると、出力ファイルが空になることがある
    • プロセス終了コードを使用してこの状態を検出できる
    • 構文エラーがある場合、終了コードは2
    • /ErrorStdOutスイッチを使用すると、エラーメッセージを抑制またはキャプチャできる

[Script Filename]について

  • [Script Filename] は引数がない場合は省略可能
  • [Script Filename] を省略した場合(スタートメニューから直接AutoHotkeyを実行する場合など)は、「~.ahk」の名前のファイル(詳細は後述)を以下の順で検索する
1.AutoHotkey実行可能ファイルを含むディレクトリ
2.現在のユーザーのドキュメントフォルダの順番で検索される
  • ファイルが存在しない場合、デフォルトのファイルを作成するかをたずねるダイアログが出る
  • スクリプトに引数を渡したい場合は省略できない
  • また、検索するファイル名(上記の「~.ahk」)は、スクリプトを実行するために使用される実行ファイルの名前によって異なる
    • AutoHotkey.exeの名前をMyScript.exeに変更すると、MyScript.ahkが検索される
引数なしで*AutoHotkeyU64*.exeを実行すると、*AutoHotkeyU64*.ahkが検索される

[Script Parameters]について

  • [Script Parameters] には任意の数の文字列をスペース区切りで渡せる
  • 文字列スペースを含みたい場合は「"」で囲む
    • 引用符で囲まれた引数(「"C:\ My Documents \“」など)のバックスラッシュは、リテラルの引用符として扱われる(つまり、スクリプトは「"C:\ My Documents"」という文字列を受け取る)
    • この引用符を削除するには、A_Args [1] := StrReplace(A_Args [1]、 “”)とすればいい
  • 渡された引数は、組み込み変数「A_Args」に配列に格納され、配列構文を使用して参照できる
  • 「A_Args [0]」には引数の数が格納されるらしい
  • スクリプトに渡される引数の数がわからない場合(一連のファイルをスクリプトドラッグアンドドロップした時など)、次の例を使用してそれらを1つずつ抽出できる
ex:  
for n, param in A_Args  ; For each parameter:  
{  
    MsgBox, Parameter number %n% is %param%.  
}
  • 引数がファイル名である場合、次の例を使用して、ファイルシステムに格納されている大文字と小文字を区別した長い名前に変換できる(完全/完全パスを含む)
ex:  
for n, param in A_Args  ; For each parameter:
{
    MsgBox, Parameter number %n% is %param%.
}

スクリプトファイルの文字コード

スクリプトファイルに含まれる文字は、ファイルのロードに使用される文字コードによって制限される

  • ファイルがUTF-8またはUTF-16(LE)バイト順序マークで始まる場合、適切な文字コードが使用され、/CP「n」スイッチ(コマンドライン引数のswitchオプションの/CPnのこと前述済み)は無視される
  • /CP「n」スイッチがコマンドラインで渡されると、文字コード「n」が使用される
    • 有効な文字コード識別子の数値一覧については、「MSDN」を参照(後ほど)
  • それ以外の場合は、システムのデフォルトの「ANSI」が使用される
    • まあ大体UTF-8で書くだろうからあんま気にしなくていいんじゃないかな
    • ボム付きにすれば基本的に問題ない
  • これは、AutoHotkeyで読み込まれたスクリプトファイルにのみ適用され、スクリプト自体の中でI/Oファイルには適用されないことに注意
  • FileEncodingは、スクリプトによって読み書きされるファイルのデフォルトのエンコーディングを制御する
  • IniReadおよびIniWriteは常にUTF-16またはANSIを処理する
  • すべてのテキストが(必要な場合)ネイティブの文字列形式に変換されるため、無効またはネイティブコードページに存在しない文字は、プレースホルダ' ‘に置き換えられる
  • これは、スクリプトファイルにエンコーディングエラーがある場合、またはファイルの保存とロードに使用されたコードページが一致しない場合にのみ発生する
  • RegWriteを使用して、エクスプローラから起動されたスクリプトのデフォルトを設定することができる(ファイルをダブルクリックするなど)

ex:HELPそのまま、autohotkeyがインストールされている前提

; 下の行のコメントを外すか、コメントにすべてコメントしておく
; 現在のビルドのデフォルトにリセットするなど、必要に応じて変更する
; ↑のコメント二つ適当に訳した
; codepage := 0        ; システムデフォルトのANSI  
; codepage := 65001    ; UTF-8  
; codepage := 1200     ; UTF-16  
; codepage := 1252     ; ANSI ラテン語 1; 西ヨーロッパ(Windows)  
if (codepage != \\"\\")  
    codepage := \\" /CP\\" . codepage  
cmd := \\'\\"%A_AhkPath%\\" %codepage% \\"\\\`%1\\" \\\`%*\\'  
key := \\"AutoHotkeyScript\\Shell\\Open\\Command\\"  
if A_IsAdmin    ; 全ユーザーへ設定  
    RegWrite, REG_SZ, HKCR\\%key%,, %cmd%  
else            ; 現在のユーザーのみに設定  
    RegWrite, REG_SZ, HKCU\\Software\\Classes\\%key%,, %cmd%

スクリプトデバッグ

  • スクリプトが期待通りに動作しているかを確認するには、スクリプト要所要所にMsgBoxコマンドを入れて、動作状況や変数の内容を表示すればよい
  • ListVarsやPauseなどのコマンドは、スクリプトに挿入した所に「ブレークポイント」を作成する
  • スクリプトがこれらの2つの行に遭遇すると、検証のためにすべての変数の現在の内容が表示される
  • 再開する準備ができたら、[ファイル]メニューまたは[トレイ]メニューからスクリプトの一時停止を解除する、すると、スクリプトは、次の「ブレークポイント」(存在する場合)に達するまで続く
  • これらのデバッグは、アクティブウィンドウが変わってしまうと正常に動作しないようなところでは使用できないので注意が必要である
  • これらのデバックはWinActivateコマンドの直前など、アクティブなウィンドウがスクリプトに関係しない位置に、これらの「ブレークポイント」を挿入するのが一般的で、こうすれば、スクリプトを再開したときに正常な動作で再開することができる
  • また、ListLines,KeyHistory,OutputDebug といったコマンドもデバッグには有用である
  • 誤字や欠落した「グローバル」宣言などの一般的なエラーは、警告を有効にすることで検出できる(デフォルトの状態)

対話型デバッグ

  • DBGpクライアントを用いた対話型デバッグが可能である
    • ブレイクポイントの設置と撤去(ブレイクポイントに達するとスクリプトの実行は一時停止される)
    • 1行ずつコードをステップ実行することができる(関数やサブルーチン自体、あるいはそれらをまたいでも可)
    • 全て、あるいは特定の変数の検査
    • 実行中のサブルーチンや関数のスタックを表示できる
  • 対話型デバックをするにはまず対応しているデバッガクライアントを起動し、/ Debugコマンドラインスイッチを使用してスクリプトを起動する
ex:  
  AutoHotkey.exe /Debug[=SERVER:PORT] ...
  • Server および Port は省略可能で、以下の二つは同じ
ex:  
  AutoHotkey /Debug "myscript.ahk"  
  AutoHotkey /Debug=localhost:9000 "myscript.ahk"
  • 実行中のスクリプトにデバッガを接続するには、以下のようにメッセージを送信すればいい
ex:実行中のスクリプトをデバッガに接続  
ScriptPath := "" ;スクリプトのフルパスを入れる  
DetectHiddenWindows On  
if WinExist("%ScriptPath% ahk_class AutoHotkey")  
    ; オプションの引数:  
    ;   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コマンドを送信してスクリプトを終了することなく切断されることがある
  • なおコンパイルしたスクリプトではこの機能は利用できない

スクリプトのEXE(実行ファイル)化-ahk2は未対応っぽい?

方法

  • ahk2exe.exeを使うことで、スクリプトを実行ファイル化することが可能
  • ahk1には同封されていたが2はないので別途ダウンが必要というかダウンしてコード変えないとじゃね疑惑
  • Ahk2Exeは、以下の三つの方法で使用できる

    1.GUIインターフェイス:スタートメニューの「.ahkから.exeへの変換」を実行
    2.右クリック:開いているエクスプローラウィンドウ内で任意の.ahkファイルを右クリックし、[スクリプトコンパイル]を選択(AutoHotkeyのインストール時にスクリプトコンパイラオプションが選択されている場合のみ使用可能)
    これにより、スクリプトと同じ基本ファイル名のEXEファイルが作成される
    このファイルは、同じディレクトリに短時間で表示される
    注:EXEファイルは、同じカスタムアイコン、.binファイルを使用して作成され、上記の方法1で最後に使用されたMPRESS設定を使用される
    3.コマンドラインコンパイラは、コマンドラインから次の引数を指定して実行できる

Ahk2Exe.exe / in MyScript.ahk [/ out MyScript.exe] [/ icon MyIcon.ico] [/ bin AutoHotkeySC.bin] [/ mpress 0or1]
スペースを含む引数は二重引用符で囲む必要がある  
"out"項目を省略すると、EXEはスクリプト自体と同じベースファイル名を持つようになる
ex)Ahk2Exe.exe /in "MyScript.ahk" /icon "MyIcon.ico"
  • 引数がAhk2Exeに渡されると、コンパイルプロセスの成功または失敗を示すメッセージがstdoutに書き込まれる。メッセージはコマンドプロンプトに表示されないが、出力をファイルにリダイレクトするなどの手段で「キャッチ」できる
  • さらに、エラーの場合、Ahk2Exeには、発生したエラーの種類を示す終了コードがあり、これらのエラーコードはGitHub(ErrorCodes.md)にあるってさ
  • リソースハッカー(フリーウェア)などのユーティリティを使用して"AutoHotkeySC.bin"ファイルを編集することで、コンパイル済みのスクリプトにバージョン情報(エクスプローラのファイルプロパティダイアログに表示されるやつ)を編集(追加)できる
  • また、Compile_AHK IIを使うとこのプロセスを容易にできる

コンパイルされたスクリプトを圧縮するには

Tips

  • コンパイルされたスクリプトでは通常、タスクトレイメニューからメインウィンドウを表示することは出来ない
  • #NoTrayIconコマンドと “Menu、Tray、ShowMainWindow"コマンドは、コンパイルされたスクリプトの動作に影響する
  • 「Menu,TRAY,MainWindow」でメインウィンドウを表示可能にできる
  • スクリプト側が、コンパイルされた状態で実行されているかどうかを知るには、「A_IsCompiled」変数を使用する、「1」ならコンパイルされている(それ以外は「0」)
  • コンパイラも公開されているが、パスワードで暗号化すれば逆コンパイルを防げる
  • 作成した実行ファイルの配布は自由
  • 実行可能ファイルを圧縮すると、メモ帳やPEリソースエディタなどのプレーンテキストエディタを使用してスクリプトソースコードを簡単に検査することはできませんが、その目的専用のツールでソースコードを抽出することができなくなる

次→(autohotkey勉強中その5)