トップ 最新

かってきままな日々

2026-03-14 (Sa) [長年日記]

_ AutoHotKey v2 + AutoHotInterception で ctrl と capslock を入れ替えた

AutoHotKey v2 をインストールする。

https://github.com/oblitum/Interception/releases から interception driver をダウンロードする。

↑の zip を展開して、端末で install-interception /install する。これでドライバがインストールされる。

OS を再起動する。

https://github.com/evilC/AutoHotInterception/releases から最新の AutoHotInterception をダウンロードする。

↑の zip から AHK v2 を展開する。

↑の zip から Common/lib/AutoHotInterception.dll を取り出して、↑の AHK v2 の lib の中に入れる。

interception driver の zip の中の library に x86 やら x64 やらあるので、 これらを AHK v2 の lib の中の該当ディレクトリにコピーする。

AHK v2 の中は、だいたい↓こんな形になる。

  • Monitor.ahk
  • ...
  • Lib
    • AutoHotInterception.ahk
    • AutoHotInterception.dll
    • CLR.ahk
    • Unblocker.ps1
    • ...
    • x86
      • interception.dll
    • x64
      • interception.dll

Unblocker.ps1 を管理者権限で実行する、とあるんだけど、 よくわからなかったので、代わりに、 各 dll のプロパティを開いて「ダウンロードしたファイルだから云々」の 許可にチェックを入れた。

Monitor.ahk をダブルクリックすると、 キーボードやマウスの一覧が表示される。 ここで、全キーボードにチェックを入れて、 ノート PC 本体のキーを適当に叩いて、ID を表示させる。 その ID の Handle をコピーする。 (ID は OS 再起動すると変わってしまうので Handle で扱う…)

AHK v2 ディレクトリの中に以下のファイルを置く。 ctrlcaps.ahk というファイル名にした。

#Requires AutoHotkey v2.0
#include Lib\AutoHotInterception.ahk ; ライブラリを読み込む
Persistent

AHI := AutoHotInterception()

; 内蔵キーボードの Handle を指定(Monitor.exe で調べたもの)
targetHandlePart := "HID\VID_048D&PID_C103&REV_0500&Col02"
laptopId := AHI.GetKeyboardIdFromHandle(targetHandlePart)

if (laptopId == 0) {
    MsgBox "内蔵キーボードが見つかりませんでした。ハンドル名を確認してください。"
    ExitApp
}

; MsgBox "laptopId " laptopId


iflock(state) {
    if (state) {
        Send("{Blind}{Ctrl down}")
    } else {
        Send("{Blind}{Ctrl up}")
    }
}

ifctrl(state) {
    if (state) {
        Send("{Blind}{CapsLock down}")
    } else {
        Send("{Blind}{CapsLock up}")
    }
}

AHI.SubscribeKey(laptopId, GetKeySC("CapsLock"), true, iflock)
AHI.SubscribeKey(laptopId, GetKeySC("Ctrl"), true, ifctrl)

; MsgBox "AutoHotkey " A_AhkVersion " が起動しました。"

↓この部分の文字列を、コピーした Handle で置き換える。

targetHandlePart := "HID\VID_048D&PID_C103&REV_0500&Col02"

ctrlcaps.ahk をダブルクリックする。 と、本体キーのみ、ctrl と capslock が入れ替わってる。はず。

Win+R して shell:startup と入力してスタートアップを開く。 ここに、ctrlcaps.ahk へのショートカットを置いておく。

いろいろ苦労したけど、だいたい手順はこんな感じだと思う。

gemini 提案のコードは、lambda を使ってたけど、なんでか lambda が使えなかったので、 関数の形にしておいた。原因不明。

#Requires AutoHotkey v2.0

が通ってるんだから、v2.0 が使われているとは思う。

ドライバをインストールする時には UAC の確認があったけど、 ctrlcaps.ahk を実行する時には確認不要なのね。

コンパイルはしてない。そのうちするかもしれんが。

OS 起動から ahk 起動まで時間がかかるので、 その間は効かない。当たり前。

キーボードごとにいじるのは、 kmonad ではできなかったけど、auto hot interception だとできた。 たぶん、interception driver を使ってる、ってところが肝で、 普通の Win API だと取れない情報が、interception driver を使うと取れる、 ってことなんだろうなぁ。