タイピング中、「英語モードのつもりで日本語を入力してしまった」またはその逆の経験はありませんか?通常、数文字入力した後で気付き、一旦入力した文字を削除してから修正を始めるのが一般的です。この手間は煩わしいですよね。
そんな悩みを解消するために、CapsLockキーを活用したAutoHotkeyスクリプトをご紹介します。このスクリプトを使用すれば、日本語入力モードと英語入力モードを素早く切り替えられ、タイピングミスやストレスが劇的に減少します。
<この記事の内容>
①AutoHotkey v2でIMEを制御する方法
②AutoHotkey v2のIMEの英語・日本入力の切り替えを効率的に行うサンプルスクリプト
先にAutohotkeyの基本を知りたい場合は、次の記事をご参照ください。
AutoHotkeyとは?
AutoHotkeyの基本概要

AutoHotkeyは、Windows環境で動作するオープンソースの自動化ツールです。キーボード操作やマウス操作をスクリプトで自動化し、作業の効率を大幅に向上させることができます。
AutoHotkeyの最大の特徴は、その柔軟性と簡易性にあります。複雑なマクロを簡単に記述できるため、初心者から上級者まで幅広いユーザーに利用されています。
今回紹介するIME変換スクリプトの概要
このAutoHotkey v2スクリプトは、Capslockキーを使い、途中まで入力モードを間違えて入力した文字列も含めて英語入力モードと日本語入力モードを瞬時に切り替えることができます。
ホットキーにCapslockキーを使う理由
CapsLockキーは、元々アルファベットの大文字入力を固定するためのキーです。日本語入力環境では、Shiftキーと共にCapsLockキーを押下して使います。
ところで現在のWindowsでは、CapsLockキー単独押下で、IMEを切り替え可能である事をご存じでしょうか。Windowsでは昔からIMEの切り替えは半角全角キーと相場がきまっていましたので、現在でもIME切り替えにCapslockが使われることは少ないようです。
そこで、このスクリプトでは、CapsLockキーを別の機能に割り当てることで、有効活用しています。
CapsLockキーは、キーボードの左側に位置しており、押しやすい場所にあります。そのため、頻繁に使う機能を割り当てるのに適しています。
またAutoHotkeyが導入されていない環境でも、間違えてCapsLockを押下したとしても、IMEのモードが変わるだけなので、作業への影響がない点もポイントです。
スクリプトの仕組みと設定方法
IME切り替えスクリプトの仕組み
このスクリプトでは、CapsLockキーを活用して以下の動作を実現します:
- 日本語入力モード中にCapsLockを押すと、IMEを英語入力モードにして、確定前の文字列を英語変換する。
- 英語入力モード中にCapsLockを押すと、IMEを日本語入力モードにして、カーソル左の連続した英文字部分だけ日本語入力モードの確定前状態にする。
この機能により、入力モードを間違えて数文字入力した後のモード切り替えにかかる手間が削減されます。さらに、CapsLockキーを使用することで、他のキーに影響を与えることなく効率的な入力環境を維持できます。
スクリプトの詳細説明
このAutoHotkeyスクリプトの中核となるコードは、IMEの現在の状態を検出し、それに応じて適切な入力モードを設定することにあります。以下はその仕組みを簡単に説明します。
;;;;;;;;;;;;IME変更と入力文字の再変換;;;;;;;;;;;;;;
vkF0:: ;日本語キーボードのCapslockの仮想コード
{
tmp := IME_GET()
if (tmp = 1) { ;日本語入力中の英語への変換
Send("+{sc07B}") ;shift+無変換 を2回押下で日本から英語へ変換。F10でも良いが変換途中でない場合にF10を押下するとメモ帳などはカーソルがメニューに飛ぶ。F9,8の連続でもよいがF9,F8はアプリで使われていそう。Ctrl+Tは他のタイミングだとアプリのタブを増やす事になるので不採用。
Sleep(20)
Send("+{sc07B}")
Sleep(10)
Send("{sc070}") ; カタカタひらがなキー ;変換中以外でShit+無変換の押下は全英数←→半角のモードに入り、このモードのまま半角にすると、次に全角に戻した時にひらがなではなく全英数になる。よってひらがなキーの押下でひらがな←→半角のモードに戻す。
Sleep(50)
IME_SET(0) ;英語入力
}
else { ;英語入力後の日本語への再変換。ここではIMEをOnにするだけ。2連打目で(この時には日本語入力になっているが)半角英字を全角変換する機能が動く。
IME_SET(1) ;IMEをオン日本語
sl:=0
MatchNo := 0
MatchNo2:= 0
Clipboard1 := ""
ClipboardMatch := ""
ClipSaved := ClipboardAll()
A_Clipboard := ""
Send("+^{Left}")
Sleep(40) ;SleepがないとNotepadでsend ^cが開始しない。
Send("^c")
Errorlevel := !ClipWait(0.4)
sl:=StrLen(A_Clipboard)
MatchNo := RegExMatch(A_Clipboard, "([a-z])+$")
Clipboard1 := SubStr(A_Clipboard, 1, MatchNo -1)
ClipboardMatch := SubStr(A_Clipboard, (MatchNo)<1 ? (MatchNo)-1 : (MatchNo))
Sleep(20)
if(sl==0){ ;選択した文字が無い場合
}
else if(sl>0 and MatchNo==0){ ;選択した文字があり、それに英字がない場合
Send("{Right}")
}
else { ;選択し文字があり英数時の場合、選択した英字を日本語変換
MatchNo2 := MatchNo - 1
Send("+{Right " MatchNo2 "}")
Sleep(20)
Send("{BS}") ;反転している状態にクリップボードをSendすれば上書きされるが、ブラウザ検索欄では上書きされない為、明示的に Send,{BS} で削除する。
Sleep(10)
ClipboardMatch := RegExReplace(ClipboardMatch, "\r|\n", "") ;Excelセル内だとなぜか改行が入るので、それを削除
Sleep(10) ;SleepがないとNotepadでsend ^cが開始しない。
Send(ClipboardMatch)
}
A_Clipboard := ClipSaved
ClipSaved := ""
}
}
;;;;;;;;;;; Function IME ;;;;;;;;;;;;;;
; IME_GETとIME_SETは、eamat様のIME制御ライブラリIME.ahkから抜粋
; https://w.atwiki.jp/eamat/pages/17.html
;-----------------------------------------------------------
; IMEの状態の取得
; WinTitle="A" 対象Window
; 戻り値 1:ON / 0:OFF
;-----------------------------------------------------------
IME_GET(WinTitle:="A") {
hwnd := WinExist(WinTitle)
if (WinActive(WinTitle)) {
ptrSize := !A_PtrSize ? 4 : A_PtrSize
cbSize := 4+4+(PtrSize*6)+16
stGTI := Buffer(cbSize,0)
NumPut("DWORD", cbSize, stGTI.Ptr,0) ; DWORD cbSize;
hwnd := DllCall("GetGUIThreadInfo", "Uint",0, "Uint", stGTI.Ptr)
? NumGet(stGTI.Ptr,8+PtrSize,"Uint") : hwnd
}
return DllCall("SendMessage"
, "UInt", DllCall("imm32\ImmGetDefaultIMEWnd", "Uint",hwnd)
, "UInt", 0x0283 ;Message : WM_IME_CONTROL
, "Int", 0x0005 ;wParam : IMC_GETOPENSTATUS
, "Int", 0) ;lParam : 0
}
;-----------------------------------------------------------
; IMEの状態をセット
; SetSts 1:ON / 0:OFF
; WinTitle="A" 対象Window
; 戻り値 0:成功 / 0以外:失敗
;-----------------------------------------------------------
IME_SET(SetSts, WinTitle:="A") {
hwnd := WinExist(WinTitle)
if (WinActive(WinTitle)) {
ptrSize := !A_PtrSize ? 4 : A_PtrSize
cbSize := 4+4+(PtrSize*6)+16
stGTI := Buffer(cbSize,0)
NumPut("Uint", cbSize, stGTI.Ptr,0) ; DWORD cbSize;
hwnd := DllCall("GetGUIThreadInfo", "Uint",0, "Uint",stGTI.Ptr)
? NumGet(stGTI.Ptr,8+PtrSize,"Uint") : hwnd
}
return DllCall("SendMessage"
, "UInt", DllCall("imm32\ImmGetDefaultIMEWnd", "Uint",hwnd)
, "UInt", 0x0283 ;Message : WM_IME_CONTROL
, "Int", 0x006 ;wParam : IMC_SETOPENSTATUS
, "Int", SetSts) ;lParam : 0 or 1
}
スクリプトの各部分の解説
- Capslockキーの仮想コード: Capslockキーの仮想コード(
vkF0
)を使い、Capslockキーが押されたときにスクリプトが実行されるように設定します。(英語キーボードならCapslockキー名を使えるようですが、日本語キーボードだと仮想コードを使用します。) - 現在のIMEモード取得:
IME_GET()
関数を使って、現在のIMEモード(日本語入力モードまたは英語入力モード)を取得します。 - 日本語入力モードの場合の処理:
- Shift+無変換キーを2回送信し、確定前の日本語入力を英語に変換します。
- カタカナひらがなキーを送信し、入力モードをひらがなに戻します。
IME_SET(0)
でIMEを英語入力モードに設定します。
- 英語入力モードの場合の処理:
IME_SET(1)
でIMEを日本語入力モードに設定します。- 直前に入力した英字を選択し、コピーします。
- 選択した英字を削除し、コピーした英字を日本語変換してペーストします。
スクリプトのポイント
- IMEの制御:
IME_GET()
とIME_SET()
を使って、IMEの状態を取得・設定することで、入力モードを切り替えています。 - キー送信:
Send()
を使って、Shift+無変換キーやカタカナひらがなキーなどのキー入力をシミュレーションしています。 - クリップボード操作: クリップボードを使って、選択した英字をコピー&ペーストしています。
注意点とカスタマイズ
- 間違えて日本語を入力した場合は、確定前にCapslockを押下して、英語変換して下さい。確定後は変換できません。
- 必要に応じてショートカットキーを変更可能です。
CapsLockキー以外のキーに割り当てたい場合や、IME以外のツールとの連携を考えたい場合には、スクリプトをさらにカスタマイズすることが可能です。たとえば、特定のアプリケーションでのみ動作させる設定も簡単に追加できます。
まとめ
タイピングミスから解放される快適さ
AutoHotkeyを活用したIME制御スクリプトは、タイピングの効率を向上させます。このスクリプトを導入することで、作業のストレスを減らし、集中力を最大化することが可能です。また、細かなカスタマイズを加えることで、自分だけの最適な環境を作り上げることもできます。