Amazonで商品を見るセール会場へ

AutoHotkey v2|ショートカット設定をINIへ保存する方法と練習例

eyecatch-autohotkey

AutoHotkeyのキー設定を保存したいときは、使用するバージョンとINIの保存場所を先に固定します。

この記事はv2用の練習で、v1のGUI構文とは混ぜません。

以前掲載していたv1の設定保存例は、作業フォルダーとファイル名の間の区切りが不足し、読み書き先も一致していませんでした。

現在の例はスクリプトのあるフォルダーに保存します。

目次

v2の練習ファイルと確認できた範囲

練習用ZIPをダウンロードし、新しいフォルダーに展開します。

公式のAutoHotkey v2を用意し、既存の自分用スクリプトとは別の場所で試してください。

AutoHotkey 2.0.28の実ランタイムでINIの読み書き、入力拒否、バックアップの内容一致を確認しました。

以下のGUIクリック、メモ帳へのキー入力、最小化はまだ実機確認していません。

所有練習ファイルで実行したAutoHotkey v2のINI読み書き・重複拒否・バックアップ一致の結果画面
AutoHotkey 2.0.28の実関数で12項目を確認し、結果をブラウザーに表示した実画面(2026/10/03)。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操作と従来の参考資料

以前の関連記事と外部コードの参照先です。

旧コードと本稿の練習ファイルは内容が異なるため、今回の手順では本稿のファイルを使います。

次に学ぶ・作業環境を選ぶ

学習を続けたい方や、作業環境を整えたい方は、目的に合うガイドをご覧ください。

仕事効率化のおすすめ書籍

仕事用PCの選び方

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次