ESCを押したときにAutoHotkeyでIMEを自動でオフにする(Windows)
https://gyazo.com/3e20a2d39cb8c81d8d5dcad161252744
VS CodeをVimモードで使ってると、ESCを押してコマンドモードにした時に日本語入力のままになってスムーズに操作できなくて困っていた。
zenhan.exe使ってみたり、VS Codeのエディタにフォーカス移ったときにIMEオフに出来ないかと試してみたりしていたけど、100%ではないのでいまいち。
AutoHotkeyは以前チャレンジして意味不明であきらめた記憶がある。でも、今の時代にはChatGPTという頼もしい仲間が!一緒に何度か試行したら作れた。(o3-mini-highを利用)
同じことに困ってるVimerは使ってみてください。
code:autohotkey
; ──────────────────────────────────────────────
; IMEを明示的にON/OFFする関数
; isOn := 0 → IME OFF(英数)
; isOn := 1 → IME ON(ひらがな)
; WinTitle := "A" → アクティブウィンドウが対象
; ──────────────────────────────────────────────
IME_SET(isOn := 0, WinTitle := "A") {
hwnd := WinGetID(WinTitle)
if !hwnd
return
; ImmGetDefaultIMEWnd で IMEウィンドウのハンドルを取得
ctl := DllCall("imm32\ImmGetDefaultIMEWnd", "Ptr", hwnd, "Ptr")
if !ctl
return
WM_IME_CONTROL := 0x283
IMC_SETOPENSTATUS := 0x006
; SendMessage( IMEウィンドウ, WM_IME_CONTROL, IMC_SETOPENSTATUS, isOn )
; isOn = 0 → IME OFF, isOn = 1 → IME ON
DllCall("SendMessage", "Ptr", ctl
, "UInt", WM_IME_CONTROL
, "Ptr", IMC_SETOPENSTATUS
, "Ptr", isOn)
}
; ──────────────────────────────────────────────
; Escキーで「IMEをオフ」にしてから、Esc本来の動作を行う
; ──────────────────────────────────────────────
Esc:: {
IME_SET(0) ; 0でIMEをOFFにする
Hotkey("Esc", "Off") ; 一時的にホットキーを無効化(再帰ループ防止)
Send("{Esc}") ; Esc本来の動作を送信
Hotkey("Esc", "On") ; ホットキーを再度有効化
}