autohotkey2.0勉強中(翻訳)その4-2~スクリプト編その2~
最終更新日:2017/10/30日(整形のみ)
前回のその1はこちら
目次
はじめに
その2では、これらの事について扱っている
これらは知らなくても普通に使えるため、結構適当
一部コンテンツ記載してないけど
+ AHKのコマンドライン引数
+ スクリプトの文字コード
+ スクリプトのEXE化(コンパイル)
その1はこちら
その1のコピペ
翻訳とかあんま得意じゃないんだけど
間違いあったらコメくれれば訂正します。というか自分も間違えて覚えてしまうから(´・ω・`)
一応各説明ごとに例は必ず一つ入れている
手抜きだからかなり見にくいかも
定期的に修正入ると思う
参考:ahkwiki日本版様及び公式ヘルプ
スクリプト編(その2)
プログラムのコマンドライン引数
AutoHotkeyのコマンドラインの書式は以下の通り
AutoHotkey.exe [Switches] [Script Filename] [Script Parameters]
コンパイル済みのexe(実行ファイル)については以下の通りになる
CompiledScript.exe [Switches] [Script Parameters]
以下ではそれぞれの場所に使用できるものについて書いてある
[Switches] に使用できるオプション
オプションのため、使用しなくても構わない コンパイル後でも使用できるもの、できないものがある
コンパイル後でも使えるもの
- /f(または/force):警告ダイアログを出さずに、強制的に起動
- #SingleInstance Offと同じ効果
- /r(または/restart):スクリプトを再読み込みしたいときに使用
- /ErrorStdOut:文法エラーをダイアログ表示せずに標準出力に出力する
コンパイル後では使えないもの
- /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] には任意の数の文字列をスペース区切りで渡せる
- 文字列スペースを含みたい場合は「"」で囲む
- 渡された引数は、組み込み変数「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, GivenPath in A_Args ; For each parameter (or file dropped onto a script): { Loop Files, GivenPath, "FD" ; Include files and directories. LongPath := A_LoopFileFullPath MsgBox "The case-corrected long path name of file`n" GivenPath "`nis:`n" LongPath }
- なお、スクリプト自身のパスを取得するには「A_ScriptFullPath」変数を使用する
- 既知の制限:ファイルを.ahkスクリプトにドラッグすると、NTFSファイルシステムで8.3の名前が無効になっていると正常に動作しなくなる可能性があるらしい
スクリプトファイルの文字コード
スクリプトファイルに含まれる文字は、ファイルのロードに使用される文字コードによって制限される
まあ大体UTF-8で書くだろうからあんま気にしなくていいんじゃないかな
ボム付きにすれば基本的に問題ないんじゃない?
ファイルがUTF-8またはUTF-16(LE)バイト順序マークで始まる場合、適切な文字コードが使用され、/CP「n」スイッチ(コマンドライン引数のswitchオプションの/CPnのこと前述済み)は無視される
/CP「n」スイッチがコマンドラインで渡されると、文字コード「n」が使用される
有効な文字コード識別子の数値一覧については、「MSDN」を参照(後ほど)
それ以外の場合は、システムのデフォルトの「ANSI」が使用される
これは、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 := 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
スクリプトのEXE(実行ファイル)化
方法
- ahk2exe.exeを使うことで、スクリプトを実行ファイル化することが可能
- 最新のahk2にはコンパイラが同封しているみたい使用方法はたぶんそのままで大丈夫だと思う
Ahk2Exeは、以下の三つの方法で使用できる
1.GUIインターフェイス:スタートメニューの「.ahkから.exeへの変換」を実行
2.右クリック:開いているエクスプローラウィンドウ内で任意の.ahkファイルを右クリックし、[スクリプトのコンパイル]を選択(AutoHotkeyのインストール時にスクリプトコンパイラオプションが選択されている場合のみ使用可能)これにより、スクリプトと同じ基本ファイル名のEXEファイルが作成される
このファイルは、同じディレクトリに短時間で表示される
注:EXEファイルは、同じカスタムアイコン、.binファイルを使用して作成され、上記の方法1で最後に使用されたMPRESS設定を使用される
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"ファイルを編集することで、コンパイル済みのスクリプトにバージョン情報(エクスプローラのファイルプロパティダイアログに表示されるやつ)を編集(追加)できる
- このファイルはAutoHotkeyがインストールされた "コンパイラ"サブフォルダに含まれている
- また、Compile_AHK IIを使うとこのプロセスを容易にできる
コンパイルされたスクリプトを圧縮するには
- Ahk2Exeはオプションで、コンパイルされたスクリプトを圧縮するためにMPRESS(MATCODEソフトウェアのフリーウェア)を使用する
- mpress.exeがAutoHotkeyがインストールされた "コンパイラ"サブフォルダに存在する場合、/ mpress 0またはGUI設定によって無効にされない限り、自動的に使用される
- オフィシャルウェブサイト(2016年3月オフライン):http://www.matcode.com/mpress.htm
- ミラーサイト(ダウンロードと情報):https://autohotkey.com/mpress/
Tips
- コンパイルされたスクリプトでは通常、タスクトレイメニューからメインウィンドウを表示することは出来ない
- #NoTrayIconコマンドと "Menu、Tray、ShowMainWindow"コマンドは、コンパイルされたスクリプトの動作に影響する
- 「Menu,TRAY,MainWindow」でメインウィンドウを表示可能にできる
- スクリプト側が、コンパイルされた状態で実行されているかどうかを知るには、「A_IsCompiled」変数を使用する、「1」ならコンパイルされている(それ以外は「0」)
- 逆コンパイラも公開されているが、パスワードで暗号化すれば逆コンパイルを防げる
- 作成した実行ファイルの配布は自由
- 実行可能ファイルを圧縮すると、メモ帳やPEリソースエディタなどのプレーンテキストエディタを使用してスクリプトのソースコードを簡単に検査することはできませんが、その目的専用のツールでソースコードを抽出することができなくなる
autohotkey2.0勉強中(翻訳)その4-1~スクリプト編その1~
最終更新日: 2017/12/23
目次
はじめに
その1ではスクリプトの基礎編として知っておくべき事柄を抜擢して並べてみた
(エスケープシーケンス入ってないけど)
内容としては以下の通りになっている
AHKの最新版(a081)では全ての関数が関数(function)に変更され、第一引数との間のカンマが不要になっているなど変更点あり
また、エスケープシーケンスも異なる仕様になったので注意
その2では、AHKのコマンドライン引数、スクリプトの文字コードについて、、スクリプトのEXE化(コンパイル)について扱っている
これらは知らなくても普通に使えるから後回し
その2はこちら
その1のコピペ
翻訳とかあんま得意じゃないんだけど
間違いあったらコメくれれば訂正します。というか自分も間違えて覚えてしまうから(´・ω・`)
一応各説明ごとに例は必ず一つ入れている
手抜きだからかなり見にくいかも
定期的に修正入ると思う
参考:ahkwiki日本版様及び公式ヘルプ
スクリプト編その1
スクリプトの書き方(基礎)
スクリプトは基本的に1行1命令(関数)で書く
スクリプトを起動したら、スクリプトは一行ずつ読み込まれ、最適化、検証されるため、エラーがあったら通知してくれる
また、エラーがあった場合は、そのエラーが修正されるまでプログラムを実行できない
関数の引数に文字列を指定する場合は、「"」で括はないといけない
ex: 一行分のスクリプト どちらもOK
以下のスクリプトの詳しい説明
MsgBox [なんちゃら]で[なんちゃら]を画面に表示する(メッセージを表示する関数)
下記の例はスクリプトの一行分になり、その内容は、MsgBox関数を用いて、引数This is script.をMsgBox関数に渡している
引数が文字列だが、スクリプト内になるため、「"」を使用しなくていいため使用してない
MsgBox "This is script."
スクリプトの起動とAuto-execute(自動実行)セクション(以下自動実行セクション)
スクリプトを起動した際の動作について書かれていて、スクリプトを記述する際、どういう風に動作するのかが書かれてる
スクリプトが読み込まれる(ahk.exeで実行される)と、Return、Exit、ホットキー、ホットストリング、スクリプトの終わりのいずれかに達するまで先頭から自動的に実行される
この部分(スクリプトが自動実行される範囲)のことを、自動実行セクションと呼ぶ
自動実行セクションが終了した際に、ホットキーなど(以下参照)がスクリプト中に記述されている場合はスクリプトが常駐状態にされる
(まあスクリプトが勝手に終わってホットキーとかが動作しないとかなったら大変だしね)
常駐状態にならない場合、スクリプトは終了する
常駐状態の場合は、ホットキー、ホットストリング、GUIイベント、カスタムメニュー項目、タイマーなどのイベントに応答して、待機(アイドル)状態で動作し続ける
自動実行セクションの完了後にこれらの条件が変更された場合や、(たとえば、最後のタイマーが無効になった場合)、最後に実行されたスレッドが完了するか、最後のGUIが終了すると、スクリプト(自動実行セクション)が終了する
自動実行セクションが終了しない例
- ホットキー
- ホットストリング
- 可視GUI(アクティブなGUI)
- アクティブなメッセージモニタ
- タイマー
- OnClipboardChangeコールバック関数
- カスタムトレイメニュー項目
- および#Persistent指令(ディレクトリ)
- Lock系キーの固定
ホットキー、カスタムメニューアイテム、タイマーで起動されるスレッドでは、下記に記載する関数での設定はそれぞれ独立している
これらの初期値は自動実行セクション内で設定できる
設定が行われる前にスレッドが呼び出されると、期待した動作にならないことがあるので、自動実行セクションのできるだけ最初の方で設定しよう
デフォルトでは自動実行セクションが完了すると、下記の設定は再度初期値に更新される
だからホットキー、ホットストリング、タイマー、またはカスタムメニュー項目を含むスクリプトの一番上でデフォルト値を変更するのがいい
自動実行セクションが完了するまでに長い時間がかかる場合(または完了しない場合)、設定のデフォルト値は100ミリ秒後に有効になる
実行時に設定が初期化される該当関数設定一覧
- DetectHiddenWindows
- DetectHiddenText
- SetTitleMatchMode
- SetBatchLines
- SetKeyDelay
- SetMouseDelay
- SetWinDelay
- SetControlDelay
- SetDefaultMouseSpeed
- Thread attributes
- CoordMode
- SetStoreCapslockMode
- AutoTrim
- SetFormat
- StringCaseSense
コメントの書き方
コメントの書き方は以下の3通りある
スクリプトを書いたときにどんなことをするために書いたのか、戻る値がなんなのかなどを書いておくことに使う
- 行頭がセミコロン「;」の行はコメント行
- 関数のあとに半角スペースを空けてセミコロンがあれば、それ以降は行末までコメント(行コメント)
- /* …… */で囲まれた範囲もコメントになる(複数行コメント)
ex:
;コメント Run "autohotkey.exe" ;これ以降はコメント(1行に限る) /* 複数行 に わたる コメント */
エスケープシーケンス
AutoHotkeyのエスケープ文字は、キーボードの左上にあるアクセント/バッククォート( )です
引用符は引用符で囲まれた文字列の中に含めるためにエスケープすることが出来る
たとえば、 ""
"", "" およびChr(34)という式はすべて二重引用符を含む文字列を生成する
特定の特殊文字も、エスケープシーケンスを用いて使用することが出来る
t(タブ),n(改行)、
r(改行)など
長い一行のスクリプトを分割する方法
スクリプトの一行がとてつもなく長いと読みづらいよね
そこで、長いなら分割すればいいじゃないか、ということになったのか何なのか知らないが、複数行に分割することができる
なお、分割しても実行の速度は変わらない←ここ重要
ヘルプの書き方だと主に引数に使用するっぽい
方法その1
やり方
and、 or、||、&&、カンマまたはピリオドで始まる行はそのすぐ上の行と自動的に結合(併合)される
++/--を除く他のすべての式演算子についても同じように一つ上の行と結合される(演算子詳細はまた今度)
これらの行の接続詞のあとにインデントは入れる必要はないが、入れたほうが可読性は上がると思う
また、上の行とつながっていることを示すコメントを入れておくことで、可読性が増す
いずれかの行と行の間または文末に、空白行またはコメントを追加することができる
方法その1の例(長いので折り畳み)
全ての例で[*]で囲んでる部分がスクリプトの結合をしている部分
ex1: 2行目がコンマで始まるため、最初の行に2行目が追加(結合)される
FileAppend "This is the text to append.`n" ; ここにコメントを書くことが出来る、`nは改行のこと *,* %A_ProgramFiles%\SomeApplication\LogFile.txt ; Comment.
ex2:"and"または "or"で始まる例
if (Color = "Red" or Color = "Green" or Color = "Blue" ;コメント *or* Color = "Black" or Color = "Gray" or Color = "White") ;コメント *and* ProductIsAvailableInColor(Product, Color) ; コメント
ex3: その他の例 この場合は三項演算子
ProductIsAvailable := (Color := "Red") *?* false ; この部分は単純に三項演算子として使われているっぽい *:* ProductIsAvailableInColor(Product, Color)
方法その2
「複数の行を結合する」または「結合したい行が"方法その1"に適していない」場合に使用する必要がある
この方法はホットストリングの自動置換に特に便利らしい
この方法を継続セクションというのだが、長いので、簡易的なやり方と、継続セクションについてがっつりで項目を分けた
やり方
結合したい複数の行を「()」で囲むだけでいい
また、初めの「(」は必ず改行してから始めなければならない
()で囲った部分は継続セクション(継続節)と言う
次の章で扱うオプションを用いないとデフォルトの状態だと各行の結合に改行が用いられるので注意
また、途中に)で始まる行を含めたい場合は、`)のようにエスケープする
方法その2の例
ex1: 継続セクションの例
「"」で囲んでいるのは変数「Var」に継続セクションを文字列で代入しているから
式に該当するので、「"」で囲まないといけない
Var := " ( ;ここから Line 1 of the text. Line 2 of the text. By default, a linefeed (`n) is present between lines. )" ;ここまでは継続セクション 結合した結果: Line 1 of the text. Line 2 of the ~ (改行で結合されるということが言いたい9)
ex2: 継続セクションのあとにオプションがくる場合の例かな?
下の例の一番下の行には、最初の行のFileAppendの最後の引数が含まれていて、このような書き方もできるらしい
このような場合にはカンマが引数を区切るためのカンマと認識される
FileAppend " ( ;ここから A line of text. By default, the hard carriage return (Enter) between the previous line and this one will be written to the file as a linefeed (`n). By default, the tab to the left of this line will also be written to the file (the same is true for spaces). By default, variable references such as %Var% are resolved to the variable's contents. )", C:\My File.txt ;ここまで( )まで)は継続セクション
継続セクション
デフォルトでは、継続セクション内の引用符は、エスケープされているかのように動作する
つまり、「"」記号はそのまま「"」として扱われる
さらに、継続セクション内の最初の行のインデントに基づいて、その後の各行の先頭のインデントが省略される
行の始まりがスペースとタブの二つで始まっているとすると、継続セクションの一番先頭の行に用いられているほうが省略される
いずれかの行が最初の行よりもインデントされているか、または間違った文字でインデントされている場合、その行の先行するすべてのインデントは消されず、そのまま残ってしまう
このデフォルトの動作を無効化させたい場合は、セクションの開始括弧の右側に次のオプションの1つ以上を設定すればいい
(LTrim Join|
式(:= 演算子を用いた代入)でも利用が可能だが、引用符の位置に注意が必要。例は↑のex1
継続セクション内にコメントは入れれない、下記に記述するCオプションで指定すれば可能になる
また、[()]から始まる行にはコメントを入れることができる
ex: コメント可能な行には ; 可能と書いてある
FileAppend, ; コメント可能 ; コメント可能 ( LTrim Join ; コメント可能 ; これはコメントにならないで文字列として扱われる ), C:\File.txt ; コメント可能
エスケープシーケンスはそのまま使える(`オプションが指定されている場合を除く)
継続セクションのオプション
継続セクションの動作は、セクションの開始括弧の右側に次のオプションの1つ以上を含めることで上書きできる
複数のオプションが存在する場合は、それぞれのオプションをスペースで区切って記述すればいい
ex:複数のオプションを設定する場合(下記のLTrimとJoinはオプション)
(LTrim Join a b c )
オプション一覧
案の定長いのでたたんでる
オプション | 説明 |
---|---|
Join [文字] |
各行の結合に使用する文字列を改行(\`n)以外に変更する 単にJoinと指定すると、各行がそのまま連結される [文字] には15文字までの文字列が指定できる また、[文字]の部分にはエスケープシーケンスが使用できる セクション内の最後の行もjoinオプションの文字で終了させるには、セクションの閉じ括弧のすぐ上に空白行を入れればいい ex: 以下の例では、各行をスペースで結合するようにしている MsgBox, (Join `s ;`sは半角スペース a b c ) 結合した結果: a b c |
LTrim | 各行の行等の半角スペースや、Tab文字を無視する |
LTrim0 |
LTrimの無効 個別では使わないかなというかどういうときに使うの? |
RTrim0 |
行末の末尾の半角スペースやTab文字を無視しないようにする RTrimはない |
C |
[;]によるコメントを有効にする あくまで[;]によるコメントのみなので、*/\*....\*/の形式のコメントは使用できない** 各行の最後に書いても、改行して単独で書いても問題ない Cの代わりにComments、Comment、Commと書いてもいい |
` | `n、`t などの特殊文字がエスケープ文字としてではなく、そのまま出力されるようになる |
, |
カンマ(,)が自動的に[`,]としてエスケープされるのを抑止する 関数の引数の区切りなどとして扱われるようになる |
Q(またはQuates) |
継続セクションを式で使用する場合で、継続セクション内の引用符で閉じることができるようになる 多分ほとんど使わない ex: Qオプションがない場合とある場合の例 Var := " ;Qなし ( テスト この後の引用符までが文字列として扱われる )" Var := " ;Qあり (Q テスト この後の引用符までが文字列として扱われる" ) ;この括弧の後ろに"をもう一度書くとエラーになる |
) |
継続節(の先頭)ではなく式として再解釈する ただしJoinオプションは除く 多分式が長い場合や継続セクションのオプション(Join)が使いたい場合に有用なのかな 説明わかりにくいし例も例でわけわかめ例や説明いいのあったらいいな ex: [)]の例、この場合括弧をエスケープする必要なく動作するらしく有用みたいよ どの[)]を示してるのかがわからないんだよね (x.y)[z]\() |
その他
書いてあったから一応書くけどもあんまりいらないというか別に今読まなくてもとか
一行は最大16383文字までらしい(そんな書かない気がするんだけど)
関数とは別に「#」で始まるプリプロセッサ指令のようなものがある また、このプリプロセッサ指令のようなものは、スクリプトが実行される前の段階で処理されるので、引数に変数を含めることは出来ない
スクリプトのデバッグ
基本的なデバッグの方法
方法その1
MsgBoxを利用する
スクリプトの要所要所にMsgBox関数を入れて、動作状況や変数の内容を表示させる
例えば、If文の各分岐先にMsgBox関数をいれるなど
ex:要所要所にMsgBox関数を入れたデバッグの方法
if ( a == 1 ) { b := 0 } else { b := 1 }
方法その2
ListVars,Pauseなどの関数を利用する
ListVarsやPauseなどの関数は、スクリプト中の挿入した所に「ブレークポイント」を作成する
スクリプトが上記の2つの関数に遭遇すると、検証のためにすべての変数の現在の内容が表示される
全ての変数が表示されるため、目的の変数のみでいい場合はMsgBox関数を使用するのがよい
再開する準備ができたら、[ファイル]メニューまたは[トレイ]メニューからスクリプトの一時停止を解除する、すると、スクリプトは、次の「ブレークポイント」(存在する場合)に達するまで続く
その他:
これらのデバッグは、アクティブウィンドウが変わってしまうと正常に動作しないようなところでは使用できないので注意が必要である
また、これらのデバックではWinActivate関数の直前など、アクティブなウィンドウがスクリプトに関係しない位置に、これらの「ブレークポイント」を挿入するのが一般的で、こうすれば、スクリプトを再開したときに正常な動作で再開することができる
また、ListLines,KeyHistory,OutputDebug といった関数もデバッグには有用である
誤字や欠落した「グローバル」宣言などの一般的なエラーは、警告を有効にすることで検出できる(デフォルトの状態)
対話型デバッグ
DBGpクライアントを用いた対話型デバッグが可能である
DBGpクライアントを用いてできること
- ブレイクポイントの設置と撤去(ブレイクポイントに達するとスクリプトの実行は一時停止される)
- 1行ずつコードをステップ実行することができる(関数やサブルーチン自体、あるいはそれらをまたいでも可)
- 全て、あるいは特定の変数の検査
- 実行中のサブルーチンや関数のスタックを表示できる
やり方
対話型デバックをするにはまず対応しているデバッガクライアントを起動し、/ Debugコマンドラインスイッチを使用してスクリプトを起動する
ex: AutoHotkey.exe /Debug[=SERVER:PORT] ...
ex: Server および Port は省略可能で、以下の二つは同じ
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関数を送信してスクリプトを終了することなく切断されることがある
なおコンパイルしたスクリプトではこの機能は利用できない
コンパイルについては次回のその2で扱っている
autohotkey2.0勉強中(翻訳)その3~リマップ編~
最終更新日: 2017/12/23
目次
はじめに
最後の方訳すのめんどくさくなってきた
その1のコピペ
翻訳とかあんま得意じゃないんだけど
間違いあったらコメくれれば訂正します。というか自分も間違えて覚えてしまうから(´・ω・`)
一応各説明ごとに例は必ず一つ入れている
手抜きだからかなり見にくいかも
定期的に修正入ると思う
参考:ahkwiki日本版様及び公式ヘルプ
リマップ編
リマップとはキーボードのキーをの入力を別のキーの入力にすること(みたいな感)
キーの指定の方法はホットキーと同じようにできる
例えば右Ctrlなら>^
基礎
レジストリ書き換えとは異なるため、AHKの指定スクリプトが動作していないとリマップされない
逆にAHKのスクリプトさえ起動していなければ通常のキーとなる
スクリプトの停止を切り替えることによってなんかできるかもね
リマップの仕方
以下のように書けば置換ができる
置換元キー::置換先キー
ex: aキーをbキーに、左Ctrlキーを右Ctrlキーに(適当だから間違ってるかも)
a::b <^::>^
キーの入れ替え
以下のように書くと二つのキーを入れ替えることになる
a::b b::a
a::B
とすると大文字のBが入力される -まあ使わなさそうだけどこんな使い方出来るっていう- コンビネーションキー(&)は設定できない
ex: a & c::b は使えない
マウスのリマッピング
なんでこの表作ったんだろうね
マウスのリマッピング用表
名前 | どのボタンか |
---|---|
LButton | マウスの左ボタン(左クリック) |
MButton | マウスの真ん中のボタン(中クリック) |
RButton | マウスの右ボタン(右クリック) |
XButton1 |
マウスの拡張ボタン1 他ボタンマウスのボタンのことで、OSのデフォルトで戻るに割り当てられているもの |
XButton2 |
マウスの拡張ボタン2 他ボタンマウスのボタンのことで、OSのデフォルトで進むに割り当てられているもの |
WheelUp | ホイールアップ(↑スクロール) |
WheelDown | ホイールダウン(↓スクロール) |
WheelLeft | チルト左(横スクロールの←) |
WheelRight | チルト右(横スクロールの→) |
その他便利事項的な
キーの入力の無効化
以下のように書くとキーの入力を無効化できる
これリマップだと思うんだけどねなんかホットキーに書かれてた
キーの指定::Return
ウィンドウ(ソフト)別に設定したいんだけど
- #IfWinActive等(#IfWinActive/Exist項目)または#ifを使うことで、特定のウィンドウのみに適応できる
まあホットキーの時と一緒で、まだそこまで書けてないからwikiさんでも見てくれれば
日本語wikiさんの#IfWinActiveのページ
なんか正常に動作しないんだけど
ロック系キー(CapsLockなどのロックキー、カタカナ/ひらがなキー)のリマップをしたらおかしくなった
日本語配列では、ロック系キーなどをリマップすることはできないというか推奨されてない
なぜなら、AHK内でUnKnownKeyとして扱われることが多く、動作が不安定になる
例えば、カタカナ/ひらがなキーをリマップしたが、関係ないキーを押した際に勝手にWindowsキーが押されるとか(実際にあった)
これにより、ロック系キーのリマップはレジストリを使うのが良い
リマップしたキーが思ったように動作しないだけど(タイトルつけづらい)
a::b
と置き換えた場合、^a のキーを押したら ^a としては機能せず、^b として機能するので注意
AltキーにリマップしたのにAltTabが動作しない
Altキーになるようにキーまたはマウスボタンをリマップしたとしても、そのリマップしたキーはAltTabの動作をしないことが多いらしい
回避策として、以下のホットキーを追加することで出来るようになるが、本当のAltキーの方でAlt-Tabを実行する際に正常に動作しない可能性がある
まあ推奨しないけどさ、もしこうするなら本当の方を使わないでリマップの方のみでAlt-Tabをやることをお勧めするよ
(こんな感じのこと書いてあった(随分意訳な気がするけど))
そうしたくないならレジストリで設定するか諦めるのがいいんじゃないかな
*Tab :: Send "{Blind} {Tab}"
自動実行セクションにSendModeが書いてある場合
SendModeが自動実行セクション(最上部に書くスクリプトのこと)で使用されている場合は、全てのリマップに影響するらしい
例えば、SendPlayモードを使用している場合で、リマップではSend {Blind}を使用してリマップしているらしく、SPモードでは、{Blind}を完全にサポートしていない
このため、SendPlayモード(特にControl、Shift、Alt、Win)ではリマッピングが正しく機能しないことがあるので注意
この問題を回避するには、スクリプト内にリマップがあるときにSPを自動実行セクションで使用しないこと
そうしても使いたい場合は、スクリプトの別の場所(自動実行セクション以外)でSPを使用する
また、SendEvent(SE)を使用したホットキーを用いたリマップも可能みたいなことが書いてあった
ホットキー用のコマンドがリマップにも影響する
スクリプトのどこかに以下の関数が書いてある場合はそれのせいかもしれない
Suspend関数あるいは、HotKey関数
(使ったことないからわかんないから書けない)
ex: 一応例↓
Suspend "On" Hotkey "*a, off" Hotkey "*a up, off"
リマップの仕組み(応用)
スクリプトが起動されると、各リマップは1組のホットキーに変換されるらしい
たとえば、a :: bのリマップは実際には次の2つのホットキーの組み合わせになっている
*a:: SetKeyDelay -1 ; 置換先キーがマウスボタンの場合、代わりにSetMouseDelayが使用されます Send "{Blind}{b DownTemp}" ; DownTempはDownと似ているが、他のSendコマンドではDownしていないように認識されている点で異なるってさ return *a up:: SetKeyDelay -1 ; これらのSetKeyDelaysのいずれかでpress-durationが指定されていない理由については、下記の注を参照してください。 Send "{Blind}{b Up}" return
説明: (あってるかわかんないけど)
まず最初のホットキー
何かしらのキーと[a]キーが押されたときに{Blind}が送信される {Blind}は現在の各種修飾キー、Capsキーの状態を保持するコマンドみたいなもので、これにより各種修飾キーの状態が保持されたままになる
この状態で、bを送信するので、例えばCtrlが押されたままならCtrl-bの動作になる
二個目のホットキー
[a]キーが離されたときに再度{Blind}を送信する 多分さっき指定した{Blind}の状態を解除しているんだと思う、(公式ヘルプに何も書いてなかったから再度指定する意味が分からないからこんなところかなと)
さっき下げた[b]キーを上げてもとに戻す
ちなみにSetKeyDelay -1 はキーの送信の速度を遅延なしにしている(他の動作に邪魔されないため)
ただし、上記のホットキーは次の状況により違う動作になる
- 置換元キーがLCtrlなどの修飾キーの場合
Send "{Blind} {LAlt DownTemp}"の行がSend "{Blind} {LCtrl Up} {LAlt DownTemp}"に置き換えられる
置換元キーがRCtrlの場合は、{RCtrl up}が使用される以外は同じになる
- マウスのボタン(RCtrl :: RButtonなど)にリマップしている場合
SetKeyDelayの代わりにSetMouseDelayが使用される
さらに、上記の一番最初のホットキーは次のように置き換えられ、キーボードのオートリピート機能によるマウスクリックが繰り返し発生することを防ぐようになっている
*RCtrl:: SetMouseDelay -1 if not GetKeyState("RButton") ; マウスの右ボタンはこの時点ではまだ押し下げられていない Send "{Blind}{RButton DownTemp}" return
注:
上記のホットキーでは、SetKeyDelayの2番目のパラメータ(押下時間)が省略されている
これは、{b down}や{b up}のようなダウンまたは、アップ専用のイベントにはプレス時間が適用されないため
ただし、Shift / Ctrl / Alt / Winキーの状態の変更は、a::B ,a::^bなどのリマップに影響を及ぼすので、スクリプトの自動実行セクションを介して適応された押下時間がリマップ全てに影響を及ぼすため、注意してね的な
カスタムコンビネーションキーをリマップに使用したい
カスタムコンビネーションキーを1つのキーに直接リマップすることはできないが、上記のように、リマップはホットキーに変換されるため、それを利用してあたかもそうかのように設定できるみたい
ex: 例えば、a & c :: b というリマップをしたい場合
上記の *a:: を a & c:: に、また、*a up:: をa & c up:: に変更すればいい
どのような動作をしてるかは↑で既に記述したのでそちらを参照
a & c:: SetKeyDelay -1 Send "{Blind}{b DownTemp}" return *a & c up:: SetKeyDelay -1 Send "{Blind}{b Up}" return
simplenoteさんの勧め
Simplenoteさんを個人的に使っていて結構便利かなと思っているので、勝手ながら紹介させてもらう。
Simplenote公式ページ
サイトは英語で書かれているけどもアプリは(ソフトも?)日本語で書かれているので完全に英語だけってわけではないです。
僕は特に簡単なメモ用に使用しています。
Simplenoteさんの特徴
- 前述したとおりにAndroidもiOSもアプリがありパソコンとスマホ間で書いたノートの内容が共有できる
- パソコンの場合はソフトを入れなくてもWEBアプリでの利用も可能なので手軽
- アカウントでの紐づけで、ネットワーク環境があり、ログインさえできれば、複数のパソコン間でも共有できて非常に便利
- ちなみにパソコンのソフトでは、Windows、Mac、Linuxに対応しています
- また、有料版、有料オプションなどはなく現状完全無料で使える
- 使う上で便利な機能がそろっていて使い勝手がとてもいい
機能面の紹介
- ピン留め
ピン留めするようにしたノートは上位に表示されるようになりアクセスがしやすくなる - Markdownに対応
Markdown形式に対応しているので、Markdownでメモしたくて複数デバイスで共有したいんだって人には最適ではないかと思います。(ほかのやつあるか知らないからいいのあるかもだけど) - Publish機能
ノートをPublishすると、URLが作られ、そのノートを他人に簡単に見せることができる! - リストア(履歴)機能
ノートを以前の状態に戻したい、間違えてしまって消すのがめんどくさいなどの時にこの機能を使えば以前の状態にノートが戻せるのでとても便利です。 - タグ付け機能
各ノートに複数のタグが設定でき、タグで絞り込みをかけることができるので、アクセスがしやすくなっています。 - ゴミ箱機能
言わずもがな、消してしまっても復元できる。さらにリストアと組み合わせると消したものを復元してさらに昔の状態に戻せて地味に便利なことも - Share機能
共有して、他のSimplenoteユーザーと共同編集ができる - zip形式でダウンロード
使ってないからわからないけどzip形式でノート全部?がダウンロードできるのかな
Sublime Textの有料版買ってね!!が表示されたら閉じるのをahk2で作ってみた(勉強中)
はじめに
まあ無料で使えるなら無料で使い倒そうという魂胆で使っていますが、
まだ使い始めたばかりなのでそんなにがっつりやってるわけでもなく。
初心者なのでそのうち使いこなしてSublimeさんに恋をしたら有料版買おうかなって思っているので取り合えず邪魔なので消させてもらう。
決して有料版を買わないようにの催促ではないのでお金ある人は買ってあげて(ボソッ
学習中の身のため間違えることが多いので、もし動作しないことや間違い等があったら指摘してくれるとありがたいです。(説明内容含む)、また、正常に動作する保証はありません、
間違えたコードは何個かまでは履歴として残して勉強用(戒め)に使ってますので間違えてコピペしてしまうと動作しないぞこのやろってなります。
autohotkeyさんについては検索してもらえれば良い紹介文でもあるかと思います。
取り合えずSublime Textさんの紹介
Sublime Text公式ホームページ
恋に落ちるテキストエディタというキャッチコピーのテキストエディタソフトです。
まだそんな使いこなしてないからがっつり紹介はできないけども高機能でpackageを追加することで色々カスタマイズできるんだよね、そのくせ軽いわ軽いわ。プログラミングの入門とかで使うエディタとしては結構いいんじゃないかな。まあそんなとこ
以下ahk2(autohotkey2)のコード
これ単独では完全に機能しないので別途ソフト起動時に呼び出すものがいります。
改善版
SetTitleMatchMode, 3 ProcessExist,ids,sublime_text.exe countersi := 0 while(ids <> 0 and countersi < 100){ ProcessExist,ids,sublime_text.exe Sleep, 1000 If WinExist("This is an unregistered copy ahk_class #32770") WinClose countersi++ } If (ids <> 0){ Reload } else { Return }
説明入れると、プロセスが存在する限りwhileループするようにして、その中の最後にカウンターとして変数をインクリメントで一つずつ増加させていって100回ループしたらこのスクリプトを再起動させるようにして正常に起動するように保っている(なんか時間たった時だったかなんかのときにsublimeさん終了されててプロセスないのにスクリプトが終わんなかったから)
追記
5/31 コード大幅に変更、ahkclassだけだとwordかなんかのやつも勝手に閉じられて困ってたからsublimeさんがアクティブだった時だけって思ってたけど完全一致で指定すれば被らないじゃんってことで簡素なのになった
削除要請等あったら消します
ていうかあまり賢くない方法でやってる気が…まあいいか。
Vimに乗り換えたのでもう使ってないのでー。
autohotkey2.0勉強中(翻訳)その2~ホットストリング編~
最終更新日:2017/9/17
目次
はじめに
その1のコピペ
翻訳とかあんま得意じゃないんだけど
間違いあったらコメくれれば訂正します。というか自分も間違えて覚えてしまうから(´・ω・`)
一応各説明ごとに例は必ず一つ入れている
手抜きだからかなり見にくいかも
定期的に修正入ると思う
参考:ahkwiki日本版様及び公式ヘルプ
ホットストリング編
ホットストリングとは、打った文字に対して特定の動作をさせる機能のことで、主な用途はホットキー同様になんかしらの動作をさせる
または、その打った文字を特定の文字に置換することができる機能のこと
記述方法はホットキーに似ている
前版のAHKLではUnicode対応で、日本語の置換もできたらしいが、AHK2ではUnicode対応にもかかわらず日本語は文字化けしてしまう(手元の環境でそうなってる)
上記の理由により、文字置換はあんまり有益な使用例はないかなとか
基礎編
ホットストリングは以下のように記述する
::設定したい文字列::置換結果の文字列
ex: endと打ったらendingに置換する例
::end::ending
ex: endと打ったらメモ帳を開く例
::end:: Run, Notepad Return
- ただその文字を打っただけでは動作せず、終了文字を打たないといけない
- デフォルトの終了文字はこいつらで、それぞれ一文字(一つのキー)で終了文字として作用する
終了文字一覧
終了文字一覧
(二個ずつ同じ種類というかグループに分けてあるけど見やすいというか覚えやすいように)
終了文字 | 説明というか名前 |
---|---|
- | バー |
( ) [ ] { } |
各種括弧 |
' " | 一重引用符、二重引用符 |
: ; | コロン、セミコロン |
/ \ | スラッシュ、バックスラッシュ バックスラッシュは日本語環境では半角の¥と同じ |
, . | コンマ(カンマ)、ピリオド |
? ! | 疑問符、感嘆符 |
`n `t | エンター、タブキー |
- 設定で終了文字は変えられる
- #Hotstring EndChars "設定したい文字" のように記述すればいい
- 上の表同様に、tabは`t、enterは`nで書く
オプション
ホットキー同様にホットストリングにもあり、設定できる
ホットストリングでの置換する際の動作が設定できる
例えば入力した文字を消去しない、終了文字を送信しないなど
オプションを個別に指定する場合
各それぞれのホットストリングに対してのみ有効となる
方法はホットストリングの最初の「;」の間にオプションを挟む
ex: 個別に指定する場合、この場合[c]の文字がオプションになる
:c:キー::置換先
以降のすべてのホットストリングに適応する場合
以下の記述をしたらそれ以降のホットストリングにそのオプションが適応される
ex: 以降のホットストリングに適応する例
#Hotstring [cなどのオプション]
ただし、一度設定したらそれ以降のホットストリングに指定したオプションが設定されてしまう為注意
もし特定オプションのみ解除した場合は下記の一覧にあるオプションの取り消しを上記の方法で設定する必要がある
一応例を↓
;オプションcの設定(以降のホットストリング全てに有効) #Hotstring c ::a::abc ;オプションcの解除(以降はcは設定されてないことになる) #Hotstring c0
オプション一覧
- すべてのオプションで後ろに0をつけると取り消しになる
- ただし、b0だけが例外で、bで取り消しになる
オプション一覧
記号(オプション) | その説明及び例 |
---|---|
? | 他の単語などがあっても動作させる
ex: ?を実際に使った例""の部分がホットストリングで変換された部分
:?:al::airlineで設定してあるとして
practic"al"→practic"airline"
|
* | 終了文字を不要で動作させる つまり指定したテキストを打ったら勝手に動作するということ まあ特定条件とか(#IfWinActive)でなら使えるかもねっていうやつ |
b0 | 入力した文字を消さず、そのまま残す つまり置換しなくて、その後ろに指定した単語を追加する形 このオプションはbで取り消しになる |
c | 大文字小文字を区別するようにする ex: intならIntegerに置換されるが、INT,iNt,Int,inTなら置換されない
:c:int::Integer
|
c1 | 大文字小文字を区別しないが、置換する際にn文字目が大文字なら置換後の文字も大文字になるらしい 手元の環境で試したらならなく、どんなパターンでも登録された形に置換された もしかして 訳ミス ex: intと打ったらIntegerにINTと打ったらINTegerになる
:c1:int::Integer
|
Kn | 遅延を指定することができる、稀にしか使わない 使うときはだいたいゲーム関連か正常に動作しない時とか また、どの送信モード(Sendコマンドのモード)かによって動作が異なる SI: 遅延は無効化される、使えないから SP: デフォルトは0で-1と同等 SE: デフォ0の-1は完全に遅延なし |
o | 自動置換で終了文字を打った際に終了文字を入力しないようにする 例えば置換対象のテキストを打った後にEnterを打って置換をするとすると、置換はされていいもののEnterが打っていることになり、改行されてうざいとかのときに有用かな |
Pn | 優先度を指定できる まああんまり使わないかなと |
R | 置換後のテキストで{Enter}のような特殊キーの解釈を行わず、そのまま置換する ex: 以下の場合Rのオプションを使用しない場合は{Enter}がそのまま置換されず{Enter}キーが送信されてしまう
:R:ent::{Enter}
|
z | 設定したホットストリングが発生した時点で、キー入力の記憶バッファをクリアする つまり、以前に入力したものを考慮しなくなり、不要なホットストリングの発生を抑えれる 以下のような場合に使用するらしい
ex::b0 *?:11 ::
SendInput xx
Return
上記の場合zオプションがないため、111を入力すると、
最初と二個目の11、二個目以降の11の二つで、ホットストリングが2回発生してしまうらしいこれを回避するためにzオプションを使用するらしい |
なんか各種送信モードも書いてあったから別途表にした
一応後に出てくる?Sendコマンドのモードなんですがまあいいや
各種送信モード
送信モードの名前 | その内容等 |
---|---|
SI(SendInput) | 入力速度が全モード中最速で、実行中はユーザーのキー入力は一切受け付けずに終了後に入力される デフォルトの送信モードはこれになっている |
SP(SendPlay) | 一遍にウィンドウにキーが送られるため、やや遅めである、SEの一部設定よりも速いが、SIよりは遅い 一度に送信するため、ゲームのコマンドなどに有用 |
SE(SendEvent) | 一定の間隔をあけるながら、個々の操作イベントを生成する つまり、一つづつキーを送るてきなことだと解釈してる 操作の再生中にユーザーによる操作の割込みが発生する可能性があるからこのモードを使用するなら注意してだって |
その他基本事項
- デフォルトの状態では、ホットストリングの入力文字の判定が大文字小文字を判定しないものになっている
- これにより、例えば下記の例ではEndでもendでもホットストリングが動作する
- また、一つでも小文字なら置換後のテキストはそのままの形だが、全部大文字なら置換後のテキストもすべて大文字になる
- 下記の例ならENDのみENDINGとなる
::end::ending
- {Enter}などの特殊キーはそのまま特殊キーが送信される
- 特殊キーはホットキーの修飾キーや、Enter,Tabキーなど
ex: entでエンターキーが送信される
::ent::{Enter}
- 変数はサポートしていない
- 設定できる置換元の文字上限は40文字
- ちなみにその逆の置換先の文字数上限はたしか4万とかだった
- ホットストリングを複数書いた場合↑にあるホットストリングほど優先順位が高い
- スペースかタブを置換後テキストの最後に入れたい場合はスペースかタブを最後に入れてそのあとに`をつける
ex: :*:btw::By the way \`
- マウスのクリックによってホットストリングの判定は解除されてしまう為以下のことが起こるので注意
- ?オプションがなくてもホットキーの発動が起こる
- 前回まで打っていた文字の判定がリセットされるので次に続きを打っても変換されない
- #Hotstring NoMouseをスクリプトの先頭にでも書いておくことで、マウス自体をホットストリングで無効化にできるみたいで、問題を回避できる
- ビルトイン変数A_EndCharには終了文字が入っていて入力した終了文字によって操作を変えたい、終了文字を送信したい等に使える
ex: 終了文字を送信する場合
SendRaw %A_EndChar%
上記でSendRawを使う理由は!{}などの文字が通常のSendコマンドによって正しく送信されないから
- スペースとタブは文字として扱われる
ex:
::btw::by the wayと::btw::" "by the wayは異なる
- 矢印キー、PageUp、PageDown、Home、Endをエディタ内で使うと判定がリセットされる
- どんなウインドウでもホットストリングの対象となるため文字入力画面以外でも発動する
- GosubまたはGotoには、最初のコロンのペア(オプション記号を含む)と名前で、ホットストリングのラベルとすることができる
ex: Gosub :: xyz
エスケープシーケンス
一部文字はエスケープシーケンスを用いないと使えない
(プログラム書いてる人とかにはおなじみだけども)
詳細は以下参照
詳細は「エスケープシーケンス」を参照(後ほど作るかな)
その他便利事項
ホットストリングで置換した後に文字消したいんだけど、カーソルの位置を動かしたいんだけど
- {bs 数}: その数バックスぺースで後ろから文字を消す
- {left 数}: 左にその数移動する
- {right 数}: 右にその数移動する(これいるのかな)
あくまでこれらは置換した後に動作するものになるので、入力文字列を置換したくない場合はb0オプションをつけること
また、これらを使う場合はたぶん終了文字打つのが邪魔になるから * オプションと組み合わせるといいんじゃないかな
ex: ()を打った際に一つ←に移す、b0は()を消去しないために
:b0:()::{left 1}
ウィンドウ(ソフト)ごとに個別でホットストリングの設定がしたいんだけど
#IfWinActive、#IfWinExistを使うことで、特定のウィンドウのみに適応できる
一応説明と例を書いておくと
#IfWinActive, [ウィンドウの指定] ホットストリング
こんな感じの書き方をすることにより#IfWinActive以下のホットストリングは#IfWinActiveで指定したウィンドウでのみ動作するようになる
一度指定したら次に#IfWinActiveで指定しなおすまでの間に書かれているホットストリングすべてに有効になる
また、#IfWinActiveのみの記述をウィンドウを指定した後に用いることで、グローバルホットストリングに戻せる
ex:以下はメモ帳が開いてる時のみのホットキーの設定
#IfWinActive, ahk_class Notepad ^a::MsgBox You pressed Ctrl-A while Notepad is active. #c::MsgBox You pressed Win-C while Notepad is active.
詳細はいつかここに書くか個別で書くかしたいな
まだそこまで書けてないからwikiさんでも見てくれれば
日本語wikiの#IfWinActiveのページ
一応、詳細は#IfWinActive/#IfWinExistを参照 ←まだ