AutoHotkeyのキー設定を保存したいときは、使用するバージョンとINIの保存場所を先に固定します。
この記事はv2用の練習で、v1のGUI構文とは混ぜません。
以前掲載していたv1の設定保存例は、作業フォルダーとファイル名の間の区切りが不足し、読み書き先も一致していませんでした。
現在の例はスクリプトのあるフォルダーに保存します。
v2の練習ファイルと確認できた範囲
練習用ZIPをダウンロードし、新しいフォルダーに展開します。
公式のAutoHotkey v2を用意し、既存の自分用スクリプトとは別の場所で試してください。
AutoHotkey 2.0.28の実ランタイムでINIの読み書き、入力拒否、バックアップの内容一致を確認しました。
以下の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へ同じ内容をコピーします。
保存途中の.new-番号ファイルが残った場合は、アプリを閉じて元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つ渡します。
既に動作中のアプリに合流する場合や、別プロセスで画面を作るアプリでは、10秒で確認できず終了することがあります。
閉じる操作と最小化は別です。
この例はWinCloseを使わず、LINEがトレイへ移る動作も保証しません。
元の設定へ戻す方法
練習画面を閉じると、このスクリプトのキー割り当ては終了します。
INIを戻す場合は、現在のsettings.iniを別名で保管してからsettings.ini.backupをsettings.iniへコピーし、再起動します。
スタートアップへの登録は、手動の練習ができてから検討します。
この記事の検証では登録しておらず、OSのキー設定も変更していません。
キーの適用範囲だけを変えたい場合はWin+Q・Win+Wをアプリ限定で割り当てる方法、WindowsとMacの共有パスは共有パス変換の記事を参照してください。
関連するWindows操作と従来の参考資料
以前の関連記事と外部コードの参照先です。
旧コードと本稿の練習ファイルは内容が異なるため、今回の手順では本稿のファイルを使います。






