AutoHotkeyでIMEの英語・日本語切り替えを効率化

IT

タイピング中、「英語モードのつもりで日本語を入力してしまった」またはその逆の経験はありませんか?通常、数文字入力した後で気付き、一旦入力した文字を削除してから修正を始めるのが一般的です。この手間は煩わしいですよね。

そんな悩みを解消するために、CapsLockキーを活用したAutoHotkeyスクリプトをご紹介します。このスクリプトを使用すれば、日本語入力モードと英語入力モードを素早く切り替えられ、タイピングミスやストレスが劇的に減少します。

<この記事の内容>
①AutoHotkey v2でIMEを制御する方法
②AutoHotkey v2のIMEの英語・日本入力の切り替えを効率的に行うサンプルスクリプト

先にAutohotkeyの基本を知りたい場合は、次の記事をご参照ください。


AutoHotkeyとは?

AutoHotkeyの基本概要

出典:AutoHotkey.com

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キーを活用して以下の動作を実現します:

  1. 日本語入力モード中にCapsLockを押すと、IMEを英語入力モードにして、確定前の文字列を英語変換する。
  2. 英語入力モード中にCapsLockを押すと、IMEを日本語入力モードにして、カーソル左の連続した英文字部分だけ日本語入力モードの確定前状態にする。

この機能により、入力モードを間違えて数文字入力した後のモード切り替えにかかる手間が削減されます。さらに、CapsLockキーを使用することで、他のキーに影響を与えることなく効率的な入力環境を維持できます。

スクリプトの詳細説明

このAutoHotkeyスクリプトの中核となるコードは、IMEの現在の状態を検出し、それに応じて適切な入力モードを設定することにあります。以下はその仕組みを簡単に説明します。

スクリプトの仕様
  • Capslockキーを押すと処理を実行
    • Capslockキーを押すと、AutoHotkeyスクリプトを実行し、まず現在のIMEの入力モードを判定します。
  • 日本語入力モードの場合:
    • 自動でShift+無変換キーを2回送り、確定前の日本語入力を英語に変換します。
    • カタカナひらがなキーで入力モードをひらがなに戻します。
    • IMEを英語入力モードに設定します。
  • 英語入力モードの場合:
    • IMEを日本語入力モードに設定します。
    • 自動でCtrl+Shift+Leftを送り、直前に入力した英字を含む文字列を選択し、クリップボードにコピーします。
    • クリップボードの文字列から、直前に入力した英字の小文字部分だけを検索し(文字列を右から英字の小文字が連続する部分で検索)、その部分を選択します。
    • BackSpaceキーで選択した英字を削除します。
    • コピーした英字を日本語変換してペーストします。
;;;;;;;;;;;;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
}

このスクリプトは、eamat様のIME制御ライブラリ IME.ahk 内のIME_GET関数とIME_SET関数を使用しています。(下記リンク参照)
https://w.atwiki.jp/eamat/pages/17.html
本スクリプトでは、編集可能な領域にカーソルを置いて文字反転をさせずにホットキーを押下すると、カーソル位置のテキスト1行分をコピーできるようにしています。しかしブラウザの文字上など編集できない場所では1行コピーができません。そこで編集可能な場所にカーソルがあるかどうかを、IMEを変換可能かどうかで判断しています。

スクリプトの各部分の解説

  1. Capslockキーの仮想コード: Capslockキーの仮想コード(vkF0)を使い、Capslockキーが押されたときにスクリプトが実行されるように設定します。(英語キーボードならCapslockキー名を使えるようですが、日本語キーボードだと仮想コードを使用します。)
  2. 現在のIMEモード取得: IME_GET()関数を使って、現在のIMEモード(日本語入力モードまたは英語入力モード)を取得します。
  3. 日本語入力モードの場合の処理:
    • Shift+無変換キーを2回送信し、確定前の日本語入力を英語に変換します。
    • カタカナひらがなキーを送信し、入力モードをひらがなに戻します。
    • IME_SET(0)でIMEを英語入力モードに設定します。
  4. 英語入力モードの場合の処理:
    • IME_SET(1)でIMEを日本語入力モードに設定します。
    • 直前に入力した英字を選択し、コピーします。
    • 選択した英字を削除し、コピーした英字を日本語変換してペーストします。

スクリプトのポイント

  • IMEの制御: IME_GET()IME_SET()を使って、IMEの状態を取得・設定することで、入力モードを切り替えています。
  • キー送信: Send()を使って、Shift+無変換キーやカタカナひらがなキーなどのキー入力をシミュレーションしています。
  • クリップボード操作: クリップボードを使って、選択した英字をコピー&ペーストしています。

注意点とカスタマイズ

  • 間違えて日本語を入力した場合は、確定前にCapslockを押下して、英語変換して下さい。確定後は変換できません。
  • 必要に応じてショートカットキーを変更可能です。

CapsLockキー以外のキーに割り当てたい場合や、IME以外のツールとの連携を考えたい場合には、スクリプトをさらにカスタマイズすることが可能です。たとえば、特定のアプリケーションでのみ動作させる設定も簡単に追加できます。

まとめ

タイピングミスから解放される快適さ

AutoHotkeyを活用したIME制御スクリプトは、タイピングの効率を向上させます。このスクリプトを導入することで、作業のストレスを減らし、集中力を最大化することが可能です。また、細かなカスタマイズを加えることで、自分だけの最適な環境を作り上げることもできます。


タイトルとURLをコピーしました