AutoHotkey v2のキー設定は、IniReadとIniWriteでINIファイルに保存できます。
INIは、設定名と値を組にして記録するテキスト形式です。
この記事の例は、メモ帳で使うCtrl+Alt+1〜9から3つを選びます。
画面で保存した設定は、スクリプトを再起動すると反映されます。
既存INIを更新するときはバックアップを作り、重複したキーや空欄は保存しません。
AutoHotkey v2用の練習コードです。
v1構文の既存スクリプトへ混ぜず、新しいフォルダーで試してください。
INIに保存する前の確認順
最初に、設定の読込・保存・復元の順番を確認します。
- AutoHotkey v2を用意し、練習用ZIPを新しいフォルダーに展開する。既存の自分用スクリプトとは、別の場所で試す。
- スクリプトと同じ場所のINIファイルから、ショートカットの設定を読み込む。INIがない場合は、初期値(Ctrl+Alt+1/2/3)を使い、まだファイルは書かない。
- GUIで設定を入力して保存する。重複、空欄、範囲外の入力は、保存時に確認される。
- 既存のINIを更新するときだけバックアップができる。初回保存では元のINIがないため作られない。再起動して設定の反映を確認する。
- キーの指定にVKやSCを使う場合は、公式のキー一覧とKeyHistoryで確認する。無変換などの値は、キーボードやIMEの環境によって異なる。
- 元に戻すときは、現在のsettings.iniを別名で保管してから、settings.ini.backupをsettings.iniへコピーして、再起動する。
GUIのクリック、メモ帳へのキー入力、最小化の動作は、ページではまだ実機確認していません。
お使いの環境で、まず練習用のウィンドウで確認してください。
v2の練習ファイルと確認できた範囲
練習用ZIPをダウンロードし、新しいフォルダーに展開します。
公式のAutoHotkey v2を用意し、既存の自分用スクリプトとは別の場所で試してください。
2026年10月3日の検証記録では、AutoHotkey 2.0.28の実ランタイムでINIの読み書き、入力拒否、バックアップの内容一致を確認しています。
2026年10月24日は本文と配布コードの一致および公式仕様を再確認しましたが、実ランタイムの試験は再実行していません。
以下のGUIクリック、メモ帳へのキー入力、最小化はまだ実機確認していません。

| 入力の状態 | 処理結果 | 次の操作 |
|---|---|---|
| INIがない | Ctrl+Alt+1/2/3を初期値にする | まだファイルを書かない |
| 重複・空欄・範囲外 | 保存しない | 入力を直す |
| 既存INIを更新 | 元の内容を.backupへ保存 | 閉じて復元できる |
| .backupが既にある | 追加の保存を止める | 元のバックアップを別の場所に保管する |
スクリプトと同じ場所に保存するINI処理
binding_store.ahkを次の内容で保存します。
Ctrl+Alt+1~9の組み合わせだけを受け付け、3つのキーが重複する場合は書き込みを止めます。
#Requires AutoHotkey v2.0
NormalizeBindings(values) {
if values.Length != 3
throw ValueError("Exactly three shortcuts are required")
result := []
seen := Map()
for value in values {
value := Trim(value)
if !RegExMatch(value, "^(?:\^!|!\^)([1-9])$", &match)
throw ValueError("Use Ctrl+Alt+1 through Ctrl+Alt+9")
key := "^!" match[1]
if seen.Has(key)
throw ValueError("Duplicate shortcut")
seen[key] := true
result.Push(key)
}
return result
}
ReadBindings(path) {
if !FileExist(path)
return ["^!1", "^!2", "^!3"]
values := []
Loop 3
values.Push(IniRead(path, "Script" A_Index, "hotkey", ""))
return NormalizeBindings(values)
}
SaveBindings(values, path) {
values := NormalizeBindings(values)
if FileExist(path ".backup")
throw Error("Backup already exists; preserve it before another save")
temp := path ".new-" A_TickCount
if FileExist(temp)
throw Error("Temporary output already exists")
if FileExist(path)
FileCopy(path, path ".backup", false)
Loop 3
IniWrite(values[A_Index], temp, "Script" A_Index, "hotkey")
FileMove(temp, path, true)
return values
}
既存のsettings.iniを書き換える前に、settings.ini.backupへ同じ内容をコピーします。
初回保存では元ファイルがないため、バックアップは作りません。
この例はScript1〜Script3のhotkeyだけを新しいINIへ書き出し、ファイル全体を置き換えます。
別の設定やコメントを保持する汎用INI編集ではないため、既存の自分用INIへそのまま流用しないでください。
保存途中の.new-番号ファイルが残った場合は、アプリを閉じて元INIとバックアップを確認し、その場で連続保存を試さないでください。
同じINIへ複数のスクリプトから同時に書き込む運用も対象外です。
GUIで保存し、再起動後に反映する
同じフォルダーにshortcut_gui.ahkを保存して起動します。
初期値のCtrl+Alt+1/2/3を、たとえばCtrl+Alt+4/5/6へ変更して保存します。
#Requires AutoHotkey v2.0
#SingleInstance Force
#Include binding_store.ahk
iniPath := A_ScriptDir "\settings.ini"
try values := ReadBindings(iniPath)
catch as err {
MsgBox "設定を読み込めません。元のINIを確認してください。`n" err.Message
ExitApp
}
; メモ帳が前面のときだけ、保存済みキーを有効にする。
HotIfWinActive("ahk_exe notepad.exe")
for index, key in values
Hotkey(key, Demo.Bind(index))
HotIf()
window := Gui(, "練習ショートカット設定")
window.AddText(, "Ctrl+Alt+1~9から、重複しない3つを選びます。")
inputs := []
for index, key in values {
window.AddText("xm", "練習 " index)
inputs.Push(window.AddHotkey("x+15 w160", key))
}
window.AddButton("xm w210", "保存(次回起動から反映)").OnEvent("Click", Save)
window.OnEvent("Close", (*) => ExitApp())
window.Show()
Demo(index, *) {
MsgBox "練習 " index " のショートカットです。"
}
Save(*) {
global inputs, iniPath
selected := []
for control in inputs
selected.Push(control.Value)
try {
SaveBindings(selected, iniPath)
MsgBox "保存しました。画面を閉じて再起動すると反映されます。"
} catch as err {
MsgBox "保存できませんでした。`n" err.Message
}
}
保存直後のキー割り当ては変えません。
画面を閉じてスクリプトを再起動し、メモ帳を前面にしたときだけ、新しいキーで練習メッセージが出ることを確認します。
メモ帳以外ではこの練習キーを割り当てませんが、メモ帳自身のショートカットとは競合し得ます。
最初は保存不要の練習文書で試し、重要な文書を編集しながら実行しないでください。
VKとSCを調べるときの注意点
スキャンコードのsc形式は、現在もキー指定に使えます。
以前の「1.1.27以降はsc形式が利用できない」という説明は誤りでした。
公式キー一覧でVKとSCの違いを確認し、KeyHistoryの該当列を見て指定します。
無変換などの実際の値はキーボード・IMEの環境によるため、本文の値だけで決めないでください。
別アプリの最小化はPIDと待ち時間で限定する
従来のLINEやChromeの例は、同じクラス名の別ウィンドウを対象にしたり、画面が現れなければ無限に待ったりする可能性がありました。
次は指定したEXEを起動し、そのPIDの画面を最大10秒待って最小化するv2の例です。
#Requires AutoHotkey v2.0
if A_Args.Length != 1 || !FileExist(A_Args[1]) {
MsgBox "対象アプリの実在するEXEパスを1つ指定してください。"
ExitApp
}
; 既に動作中のアプリへ合流すると、PIDが一致しない場合がある。
Run('"' A_Args[1] '"', , , &pid)
hwnd := WinWait("ahk_pid " pid, , 10)
if !hwnd {
MsgBox "10秒以内に、このPIDの画面を確認できませんでした。"
ExitApp
}
WinMinimize("ahk_id " hwnd)
; ウィンドウを閉じず、最小化だけを行う。
minimize_started.ahkには、対象EXEのフルパスを引数として1つ渡します。
コマンドプロンプトを開き、次の3つのパスを実在する場所に置き換えて実行します。
"C:\Program Files\AutoHotkey\v2\AutoHotkey64.exe" "C:\AHK練習\minimize_started.ahk" "C:\対象アプリ\App.exe"
この例は64ビット版のパス例であり、インストール先は環境に合わせてください。
空白を含むパスが分割されないように、それぞれを二重引用符で囲みます。
対象のウィンドウが最小化されるか、10秒後に確認できない旨が表示されるかを確認します。
EXEを起動できない場合は、待機処理の前にエラーで止まることがあります。
パスと実行権限を確認し、別プロセスに合流するアプリの制約とは分けて調べます。
既に動作中のアプリに合流する場合や、別プロセスで画面を作るアプリでは、10秒で確認できず終了することがあります。
閉じる操作と最小化は別です。
この例はWinCloseを使わず、LINEがトレイへ移る動作も保証しません。
引数の渡し方は公式のコマンドライン仕様、PIDと起動失敗の扱いはRunを参照してください。
10秒の待機とタイムアウト時の戻り値は、WinWaitの公式仕様に基づきます。
元の設定へ戻す方法
練習画面を閉じると、このスクリプトのキー割り当ては終了します。
バックアップがある場合は、現在のsettings.iniを別名で保管してからsettings.ini.backupをsettings.iniへコピーし、再起動します。
初回保存から初期値へ戻す場合は、スクリプトを終了してsettings.iniを別名で退避し、INIがない状態で起動します。
スタートアップへの登録は、手動の練習ができてから検討します。
この記事の検証では登録しておらず、OSのキー設定も変更していません。
キーの適用範囲だけを変えたい場合はWin+Q・Win+Wをアプリ限定で割り当てる方法、WindowsとMacの共有パスは共有パス変換の記事を参照してください。
関連するWindows操作と従来の参考資料
以前の関連記事と外部コードの参照先です。
旧コードと本稿の練習ファイルは内容が異なるため、今回の手順では本稿のファイルを使います。






保存や読み込みに失敗したとき
保存先はA_ScriptDirで指定しているため、起動時の作業フォルダーではなくスクリプトと同じ場所です。
ZIP内のshortcut_gui.ahkとbinding_store.ahkを同じフォルダーに置き、書き込み可能な場所で試します。
設定が読めない場合は、settings.iniのScript1〜Script3にhotkeyがあり、値が重複していないかを確認してください。
INI全体がない場合だけ初期値を使い、既存INIの項目欠落や不正値では読み込みを止めます。
.backupが存在するときは、現在のINIも別名で保管してから、バックアップを別の場所へ移します。
コピーするだけでは元の.backupが残るため、次の保存は引き続き拒否されます。
保存途中の一時ファイルや権限エラーがある場合は、元INIとバックアップを確認してから復旧します。
IniReadの既定値と、IniWriteの保存先・エラー仕様を2026年10月26日に公式資料で確認しました。
本文3本と配布ZIPのコード一致は確認しましたが、今回GUI・キー入力・最小化の実動作試験は行っていません。
