AutoHotkeyで英語キーボードの日本語変換キーをalt短押しカスタマイズ
altキー短押しで以下の動作をします
左alt: IMEオンの場合、「IME OFF」仮想キーにリマップ
右alt: IMEオフの場合、「IME ON」仮想キーにリマップ
あとは、IMEの設定でいい感じに(後述)
詳しくは以下の記事を参照:
動機
時々altキーが押しっぱなし状態になってしまい解除できなくなる現象
これらの動作の調整をしたくなり、 AutoHotkey v2 で動作するスクリプトを自分で作成しました。 AutoHotkey のスクリプト
code:ahk
; LICENSE: MIT
; Author: Takayuki Shimizukawa 2026
IME_GET(WinTitle := "A") {
; アクティブウィンドウのハンドルを取得。ハンドルはWindows内部でウィンドウを一意に識別する整数値
hwnd := WinExist(WinTitle)
; Win32 API ImmGetDefaultIMEWnd を呼び出し、そのウィンドウに対応するIME管理ウィンドウのハンドルを取得。
; IMEはウィンドウごとに隠しウィンドウを持っていて、状態や設定が管理されている。
DefaultIMEWnd := DllCall("imm32\ImmGetDefaultIMEWnd", "Ptr", hwnd, "Ptr")
; SendMessage でIME管理ウィンドウにメッセージを送って状態を取得。
; | 引数 | 値 | 意味
; | ---- | ------------- | ---------------------------- |
; | 第1引数 | DefaultIMEWnd | 送信先(IME管理ウィンドウ)
; | 第2引数 | 0x0283 | WM_IME_CONTROL(IME制御メッセージ)
; | 第3引数 | 0x005 | IMC_GETOPENSTATUS(オープン状態を取得)
; | 第4引数 | 0 | 未使用(0固定)
return DllCall("SendMessage", "Ptr", DefaultIMEWnd, "UInt", 0x0283, "Int", 0x005, "Int", 0, "Int")
}
; 未定義のダミーキー(vk07)を送信し、「Alt単体の空打ち」でWindowsのメニューバーが開いてしまう挙動を抑制
~*LAlt::Send("{Blind}{vk07}")
~*RAlt::Send("{Blind}{vk07}")
LAlt Up:: {
; 既にIMEオフなら何もしない、オンのときだけオフにする
if (IME_GET() != 0)
Send("{vk1A}") ; VK_IME_OFF
;Send("{vk1D}") ; VK_NONCONVERT 無変換 を経由したい場合
}
RAlt Up:: {
; 既にIMEオンなら何もしない、オフのときだけオンにする
if (IME_GET() == 0)
Send("{vk16}") ; VK_IME_ON
; Send("{vk1C}") ; VK_CONVERT 変換 を経由したい場合
}
; Virtual-Key コード (Winuser.h) - Win32 apps | Microsoft Learn
LAlt Up:: でキーを離したときに初めてIMEを切り替えるため、Altを使うキーバインド(例えば Alt+F4, Alt+Spaceなど)の操作中はAltとして普通に機能します。
変換 / 無変換 を経由したい場合、とは
MS-IME の場合、IMEのOn / Off の直接状態変更は漢字変換中にうまくいきません。無変換と変換を経由することでうまくいくようです これによって、このスクリプト単体では「英語キーボードでも「変換」「無変換キー」を押したい」を実現
MS-IME キーマップの場合、IME OFF で入力中文字列は確定されてからOffになります ATOK キーマップの場合、IME OFF で入力中文字列を取り消してからOffになります これらの動作はキーカスタマイズで変更できます。
code:keymap.txt
Composition OFF IMEOff ; 元は CancelAndIMEOff
Conversion OFF IMEOff ; 元は CancelAndIMEOff
Precomposition OFF IMEOff ; 元は CancelAndIMEOff
これでATOKで「確定+IMEを無効化」が出来ました!
Mozkeyはキーカスタマイズに複数機能を割り当てもできます。 Commit + IMEOff を割り当てることで、日本語入力中や変換中の状態を確実に確定できます
code:mozkey-ime-keymap.txt
Composition OFF Commit|IMEOff
Conversion OFF Commit|IMEOff
文字入力中のIME OFF では入力文字が未確定のまま残ってしまいます。
そこで、AutoHotkeyのマッピングを「変換」「無変換」に向けたところ、期待する動作になりました。
o 「無変換」で変換中と、入力中文字列を確定してIME Off
o 「変換」でIME On
文字入力中のIME OFF では入力文字が未確定のまま残ってしまいます。
そこで、AutoHotkeyのマッピングを「変換」「無変換」に向けたところ、部分的に、期待する動作になりました。
o 「無変換」で変換中文字列を確定してIME Off
x 「無変換」で入力中文字列は確定もキャンセルもせず残ったまま IME Off
o 「変換」でIME On
割り当てカスタマイズしてもだめだった
https://scrapbox.io/files/6a32ab0b2ba3627f4ebcd311.png
2026/6/20 時点
今のところ、MS Copilot Keybaord, Google IME, Mozkey は合格。
Google IME は、IME On/Off動作が素直、キー設定でマッピングを調整しやすくてGood. 企業内の商用利用でもライセンス的に安心 Mozkey は、キー周りはGoogle IME同様にGood。漢字変換の書き味も好き。しかし企業利用は今はNGかなあ..