├── IME.ahk ├── README.md └── alt-ime-ahk.ahk /IME.ahk: -------------------------------------------------------------------------------- 1 | /***************************************************************************** 2 | IME制御用 関数群 (IME.ahk) 3 | 4 | グローバル変数 : なし 5 | 各関数の依存性 : なし(必要関数だけ切出してコピペでも使えます) 6 | 7 | AutoHotkey: L 1.1.08.01 8 | Language: Japanease 9 | Platform: NT系 10 | Author: eamat. http://www6.atwiki.jp/eamat/ 11 | ***************************************************************************** 12 | 履歴 13 | 2008.07.11 v1.0.47以降の 関数ライブラリスクリプト対応用にファイル名を変更 14 | 2008.12.10 コメント修正 15 | 2009.07.03 IME_GetConverting() 追加 16 | Last Found Windowが有効にならない問題修正、他。 17 | 2009.12.03 18 | ・IME 状態チェック GUIThreadInfo 利用版 入れ込み 19 | (IEや秀丸8βでもIME状態が取れるように) 20 | http://blechmusik.xrea.jp/resources/keyboard_layout/DvorakJ/inc/IME.ahk 21 | ・Google日本語入力β 向け調整 22 | 入力モード 及び 変換モードは取れないっぽい 23 | IME_GET/SET() と IME_GetConverting()は有効 24 | 25 | 2012.11.10 x64 & Unicode対応 26 | 実行環境を AHK_L U64に (本家およびA32,U32版との互換性は維持したつもり) 27 | ・LongPtr対策:ポインタサイズをA_PtrSizeで見るようにした 28 | 29 | ;================================== 30 | ; GUIThreadInfo 31 | ;================================= 32 | ; 構造体 GUITreadInfo 33 | ;typedef struct tagGUITHREADINFO {(x86) (x64) 34 | ; DWORD cbSize; 0 0 35 | ; DWORD flags; 4 4 ※ 36 | ; HWND hwndActive; 8 8 37 | ; HWND hwndFocus; 12 16 ※ 38 | ; HWND hwndCapture; 16 24 39 | ; HWND hwndMenuOwner; 20 32 40 | ; HWND hwndMoveSize; 24 40 41 | ; HWND hwndCaret; 28 48 42 | ; RECT rcCaret; 32 56 43 | ;} GUITHREADINFO, *PGUITHREADINFO; 44 | 45 | ・WinTitleパラメータが実質無意味化していたのを修正 46 | 対象がアクティブウィンドウの時のみ GetGUIThreadInfoを使い 47 | そうでないときはControlハンドルを使用 48 | 一応バックグラウンドのIME情報も取れるように戻した 49 | (取得ハンドルをWindowからControlに変えたことでブラウザ以外の大半の 50 | アプリではバックグラウンドでも正しく値が取れるようになった。 51 | ※ブラウザ系でもアクティブ窓のみでの使用なら問題ないと思う、たぶん) 52 | 53 | */ 54 | 55 | ;--------------------------------------------------------------------------- 56 | ; 汎用関数 (多分どのIMEでもいけるはず) 57 | 58 | ;----------------------------------------------------------- 59 | ; IMEの状態の取得 60 | ; WinTitle="A" 対象Window 61 | ; 戻り値 1:ON / 0:OFF 62 | ;----------------------------------------------------------- 63 | IME_GET(WinTitle="A") { 64 | ControlGet,hwnd,HWND,,,%WinTitle% 65 | if (WinActive(WinTitle)) { 66 | ptrSize := !A_PtrSize ? 4 : A_PtrSize 67 | VarSetCapacity(stGTI, cbSize:=4+4+(PtrSize*6)+16, 0) 68 | NumPut(cbSize, stGTI, 0, "UInt") ; DWORD cbSize; 69 | hwnd := DllCall("GetGUIThreadInfo", Uint,0, Uint,&stGTI) 70 | ? NumGet(stGTI,8+PtrSize,"UInt") : hwnd 71 | } 72 | 73 | return DllCall("SendMessage" 74 | , UInt, DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hwnd) 75 | , UInt, 0x0283 ;Message : WM_IME_CONTROL 76 | , Int, 0x0005 ;wParam : IMC_GETOPENSTATUS 77 | , Int, 0) ;lParam : 0 78 | } 79 | 80 | ;----------------------------------------------------------- 81 | ; IMEの状態をセット 82 | ; SetSts 1:ON / 0:OFF 83 | ; WinTitle="A" 対象Window 84 | ; 戻り値 0:成功 / 0以外:失敗 85 | ;----------------------------------------------------------- 86 | IME_SET(SetSts, WinTitle="A") { 87 | ControlGet,hwnd,HWND,,,%WinTitle% 88 | if (WinActive(WinTitle)) { 89 | ptrSize := !A_PtrSize ? 4 : A_PtrSize 90 | VarSetCapacity(stGTI, cbSize:=4+4+(PtrSize*6)+16, 0) 91 | NumPut(cbSize, stGTI, 0, "UInt") ; DWORD cbSize; 92 | hwnd := DllCall("GetGUIThreadInfo", Uint,0, Uint,&stGTI) 93 | ? NumGet(stGTI,8+PtrSize,"UInt") : hwnd 94 | } 95 | 96 | return DllCall("SendMessage" 97 | , UInt, DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hwnd) 98 | , UInt, 0x0283 ;Message : WM_IME_CONTROL 99 | , Int, 0x006 ;wParam : IMC_SETOPENSTATUS 100 | , Int, SetSts) ;lParam : 0 or 1 101 | } 102 | 103 | ;=========================================================================== 104 | ; IME 入力モード (どの IMEでも共通っぽい) 105 | ; DEC HEX BIN 106 | ; 0 (0x00 0000 0000) かな 半英数 107 | ; 3 (0x03 0000 0011) 半カナ 108 | ; 8 (0x08 0000 1000) 全英数 109 | ; 9 (0x09 0000 1001) ひらがな 110 | ; 11 (0x0B 0000 1011) 全カタカナ 111 | ; 16 (0x10 0001 0000) ローマ字半英数 112 | ; 19 (0x13 0001 0011) 半カナ 113 | ; 24 (0x18 0001 1000) 全英数 114 | ; 25 (0x19 0001 1001) ひらがな 115 | ; 27 (0x1B 0001 1011) 全カタカナ 116 | 117 | ; ※ 地域と言語のオプション - [詳細] - 詳細設定 118 | ; - 詳細なテキストサービスのサポートをプログラムのすべてに拡張する 119 | ; が ONになってると値が取れない模様 120 | ; (Google日本語入力βはここをONにしないと駄目なので値が取れないっぽい) 121 | 122 | ;------------------------------------------------------- 123 | ; IME 入力モード取得 124 | ; WinTitle="A" 対象Window 125 | ; 戻り値 入力モード 126 | ;-------------------------------------------------------- 127 | IME_GetConvMode(WinTitle="A") { 128 | ControlGet,hwnd,HWND,,,%WinTitle% 129 | if (WinActive(WinTitle)) { 130 | ptrSize := !A_PtrSize ? 4 : A_PtrSize 131 | VarSetCapacity(stGTI, cbSize:=4+4+(PtrSize*6)+16, 0) 132 | NumPut(cbSize, stGTI, 0, "UInt") ; DWORD cbSize; 133 | hwnd := DllCall("GetGUIThreadInfo", Uint,0, Uint,&stGTI) 134 | ? NumGet(stGTI,8+PtrSize,"UInt") : hwnd 135 | } 136 | return DllCall("SendMessage" 137 | , UInt, DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hwnd) 138 | , UInt, 0x0283 ;Message : WM_IME_CONTROL 139 | , Int, 0x001 ;wParam : IMC_GETCONVERSIONMODE 140 | , Int, 0) ;lParam : 0 141 | } 142 | 143 | ;------------------------------------------------------- 144 | ; IME 入力モードセット 145 | ; ConvMode 入力モード 146 | ; WinTitle="A" 対象Window 147 | ; 戻り値 0:成功 / 0以外:失敗 148 | ;-------------------------------------------------------- 149 | IME_SetConvMode(ConvMode,WinTitle="A") { 150 | ControlGet,hwnd,HWND,,,%WinTitle% 151 | if (WinActive(WinTitle)) { 152 | ptrSize := !A_PtrSize ? 4 : A_PtrSize 153 | VarSetCapacity(stGTI, cbSize:=4+4+(PtrSize*6)+16, 0) 154 | NumPut(cbSize, stGTI, 0, "UInt") ; DWORD cbSize; 155 | hwnd := DllCall("GetGUIThreadInfo", Uint,0, Uint,&stGTI) 156 | ? NumGet(stGTI,8+PtrSize,"UInt") : hwnd 157 | } 158 | return DllCall("SendMessage" 159 | , UInt, DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hwnd) 160 | , UInt, 0x0283 ;Message : WM_IME_CONTROL 161 | , Int, 0x002 ;wParam : IMC_SETCONVERSIONMODE 162 | , Int, ConvMode) ;lParam : CONVERSIONMODE 163 | } 164 | 165 | ;=========================================================================== 166 | ; IME 変換モード (ATOKはver.16で調査、バージョンで多少違うかも) 167 | 168 | ; MS-IME 0:無変換 / 1:人名/地名 / 8:一般 /16:話し言葉 169 | ; ATOK系 0:固定 / 1:複合語 / 4:自動 / 8:連文節 170 | ; WXG / 1:複合語 / 2:無変換 / 4:自動 / 8:連文節 171 | ; SKK系 / 1:ノーマル (他のモードは存在しない?) 172 | ; Googleβ / 8:ノーマル 173 | ;------------------------------------------------------------------ 174 | ; IME 変換モード取得 175 | ; WinTitle="A" 対象Window 176 | ; 戻り値 MS-IME 0:無変換 1:人名/地名 8:一般 16:話し言葉 177 | ; ATOK系 0:固定 1:複合語 4:自動 8:連文節 178 | ; WXG4 1:複合語 2:無変換 4:自動 8:連文節 179 | ;------------------------------------------------------------------ 180 | IME_GetSentenceMode(WinTitle="A") { 181 | ControlGet,hwnd,HWND,,,%WinTitle% 182 | if (WinActive(WinTitle)) { 183 | ptrSize := !A_PtrSize ? 4 : A_PtrSize 184 | VarSetCapacity(stGTI, cbSize:=4+4+(PtrSize*6)+16, 0) 185 | NumPut(cbSize, stGTI, 0, "UInt") ; DWORD cbSize; 186 | hwnd := DllCall("GetGUIThreadInfo", Uint,0, Uint,&stGTI) 187 | ? NumGet(stGTI,8+PtrSize,"UInt") : hwnd 188 | } 189 | return DllCall("SendMessage" 190 | , UInt, DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hwnd) 191 | , UInt, 0x0283 ;Message : WM_IME_CONTROL 192 | , Int, 0x003 ;wParam : IMC_GETSENTENCEMODE 193 | , Int, 0) ;lParam : 0 194 | } 195 | 196 | ;---------------------------------------------------------------- 197 | ; IME 変換モードセット 198 | ; SentenceMode 199 | ; MS-IME 0:無変換 1:人名/地名 8:一般 16:話し言葉 200 | ; ATOK系 0:固定 1:複合語 4:自動 8:連文節 201 | ; WXG 1:複合語 2:無変換 4:自動 8:連文節 202 | ; WinTitle="A" 対象Window 203 | ; 戻り値 0:成功 / 0以外:失敗 204 | ;----------------------------------------------------------------- 205 | IME_SetSentenceMode(SentenceMode,WinTitle="A") { 206 | ControlGet,hwnd,HWND,,,%WinTitle% 207 | if (WinActive(WinTitle)) { 208 | ptrSize := !A_PtrSize ? 4 : A_PtrSize 209 | VarSetCapacity(stGTI, cbSize:=4+4+(PtrSize*6)+16, 0) 210 | NumPut(cbSize, stGTI, 0, "UInt") ; DWORD cbSize; 211 | hwnd := DllCall("GetGUIThreadInfo", Uint,0, Uint,&stGTI) 212 | ? NumGet(stGTI,8+PtrSize,"UInt") : hwnd 213 | } 214 | return DllCall("SendMessage" 215 | , UInt, DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hwnd) 216 | , UInt, 0x0283 ;Message : WM_IME_CONTROL 217 | , Int, 0x004 ;wParam : IMC_SETSENTENCEMODE 218 | , Int, SentenceMode) ;lParam : SentenceMode 219 | } 220 | 221 | 222 | ;--------------------------------------------------------------------------- 223 | ; IMEの種類を選ぶかもしれない関数 224 | 225 | ;========================================================================== 226 | ; IME 文字入力の状態を返す 227 | ; (パクリ元 : http://sites.google.com/site/agkh6mze/scripts#TOC-IME- ) 228 | ; 標準対応IME : ATOK系 / MS-IME2002 2007 / WXG / SKKIME 229 | ; その他のIMEは 入力窓/変換窓を追加指定することで対応可能 230 | ; 231 | ; WinTitle="A" 対象Window 232 | ; ConvCls="" 入力窓のクラス名 (正規表現表記) 233 | ; CandCls="" 候補窓のクラス名 (正規表現表記) 234 | ; 戻り値 1 : 文字入力中 or 変換中 235 | ; 2 : 変換候補窓が出ている 236 | ; 0 : その他の状態 237 | ; 238 | ; ※ MS-Office系で 入力窓のクラス名 を正しく取得するにはIMEのシームレス表示を 239 | ; OFFにする必要がある 240 | ; オプション-編集と日本語入力-編集中の文字列を文書に挿入モードで入力する 241 | ; のチェックを外す 242 | ;========================================================================== 243 | IME_GetConverting(WinTitle="A",ConvCls="",CandCls="") { 244 | 245 | ;IME毎の 入力窓/候補窓Class一覧 ("|" 区切りで適当に足してけばOK) 246 | ConvCls .= (ConvCls ? "|" : "") ;--- 入力窓 --- 247 | . "ATOK\d+CompStr" ; ATOK系 248 | . "|imejpstcnv\d+" ; MS-IME系 249 | . "|WXGIMEConv" ; WXG 250 | . "|SKKIME\d+\.*\d+UCompStr" ; SKKIME Unicode 251 | . "|MSCTFIME Composition" ; Google日本語入力 252 | 253 | CandCls .= (CandCls ? "|" : "") ;--- 候補窓 --- 254 | . "ATOK\d+Cand" ; ATOK系 255 | . "|imejpstCandList\d+|imejpstcand\d+" ; MS-IME 2002(8.1)XP付属 256 | . "|mscandui\d+\.candidate" ; MS Office IME-2007 257 | . "|WXGIMECand" ; WXG 258 | . "|SKKIME\d+\.*\d+UCand" ; SKKIME Unicode 259 | CandGCls := "GoogleJapaneseInputCandidateWindow" ;Google日本語入力 260 | 261 | ControlGet,hwnd,HWND,,,%WinTitle% 262 | if (WinActive(WinTitle)) { 263 | ptrSize := !A_PtrSize ? 4 : A_PtrSize 264 | VarSetCapacity(stGTI, cbSize:=4+4+(PtrSize*6)+16, 0) 265 | NumPut(cbSize, stGTI, 0, "UInt") ; DWORD cbSize; 266 | hwnd := DllCall("GetGUIThreadInfo", Uint,0, Uint,&stGTI) 267 | ? NumGet(stGTI,8+PtrSize,"UInt") : hwnd 268 | } 269 | 270 | WinGet, pid, PID,% "ahk_id " hwnd 271 | tmm:=A_TitleMatchMode 272 | SetTitleMatchMode, RegEx 273 | ret := WinExist("ahk_class " . CandCls . " ahk_pid " pid) ? 2 274 | : WinExist("ahk_class " . CandGCls ) ? 2 275 | : WinExist("ahk_class " . ConvCls . " ahk_pid " pid) ? 1 276 | : 0 277 | SetTitleMatchMode, %tmm% 278 | return ret 279 | } 280 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # alt-ime-ahk 2 | 3 | ## 概要 4 | 5 | 左右 Alt キーの空打ちで IME を OFF/ON する AutoHotKey スクリプトです。 6 | 7 | * 左 Alt キーの空打ちで IME を「英数」に切り替え 8 | * 右 Alt キーの空打ちで IME を「かな」に切り替え 9 | * Alt キーを押している間に他のキーを打つと通常の Alt キーとして動作 10 | 11 | ## 動作環境 12 | 13 | * Windows10 14 | 15 | ## 使い方 16 | 17 | [alt-ime-ahk v0.4.6](https://github.com/karakaram/alt-ime-ahk/releases/download/v0.4.6/alt-ime-ahk.zip) から alt-ime-ahk.zip をダウンロードして解凍し、alt-ime-ahk.exe を好きな場所に置き、起動してください。 タスクトレイに常駐します。 18 | 19 | 終了する場合はタスクトレイのアイコンを右クリックし、「終了」をクリックしてください。 20 | 21 | アンインストールは alt-ime-ahk.exe を削除するだけで OK です。 22 | 23 | ## JetBrains 製の IDE で使う場合は Tool Buttons をオンに 24 | 25 | IntelliJ IDEA など JetBrains 製の IDE をお使いの方は「上部メニューバー > View > Tool Buttons」をオンにしてください。 26 | 27 | オフのまま使うと Alt キーを離した際に alt-ime-ahk.exe がエラー終了します。 28 | 29 | ## ブログの紹介ページ 30 | 31 | [Altの空打ちで日本語入力(IME)を切り替えるツールを作った](http://www.karakaram.com/alt-ime-on-off/) 32 | 33 | -------------------------------------------------------------------------------- /alt-ime-ahk.ahk: -------------------------------------------------------------------------------- 1 | ; 左右 Alt キーの空打ちで IME の OFF/ON を切り替える 2 | ; 3 | ; 左 Alt キーの空打ちで IME を「英数」に切り替え 4 | ; 右 Alt キーの空打ちで IME を「かな」に切り替え 5 | ; Alt キーを押している間に他のキーを打つと通常の Alt キーとして動作 6 | ; 7 | ; Author: karakaram http://www.karakaram.com/alt-ime-on-off 8 | 9 | #Include IME.ahk 10 | 11 | ; Razer Synapseなど、キーカスタマイズ系のツールを併用しているときのエラー対策 12 | #MaxHotkeysPerInterval 350 13 | 14 | ; 主要なキーを HotKey に設定し、何もせずパススルーする 15 | *~a:: 16 | *~b:: 17 | *~c:: 18 | *~d:: 19 | *~e:: 20 | *~f:: 21 | *~g:: 22 | *~h:: 23 | *~i:: 24 | *~j:: 25 | *~k:: 26 | *~l:: 27 | *~m:: 28 | *~n:: 29 | *~o:: 30 | *~p:: 31 | *~q:: 32 | *~r:: 33 | *~s:: 34 | *~t:: 35 | *~u:: 36 | *~v:: 37 | *~w:: 38 | *~x:: 39 | *~y:: 40 | *~z:: 41 | *~1:: 42 | *~2:: 43 | *~3:: 44 | *~4:: 45 | *~5:: 46 | *~6:: 47 | *~7:: 48 | *~8:: 49 | *~9:: 50 | *~0:: 51 | *~F1:: 52 | *~F2:: 53 | *~F3:: 54 | *~F4:: 55 | *~F5:: 56 | *~F6:: 57 | *~F7:: 58 | *~F8:: 59 | *~F9:: 60 | *~F10:: 61 | *~F11:: 62 | *~F12:: 63 | *~`:: 64 | *~~:: 65 | *~!:: 66 | *~@:: 67 | *~#:: 68 | *~$:: 69 | *~%:: 70 | *~^:: 71 | *~&:: 72 | *~*:: 73 | *~(:: 74 | *~):: 75 | *~-:: 76 | *~_:: 77 | *~=:: 78 | *~+:: 79 | *~[:: 80 | *~{:: 81 | *~]:: 82 | *~}:: 83 | *~\:: 84 | *~|:: 85 | *~;:: 86 | *~':: 87 | *~":: 88 | *~,:: 89 | *~<:: 90 | *~.:: 91 | *~>:: 92 | *~/:: 93 | *~?:: 94 | *~Esc:: 95 | *~Tab:: 96 | *~Space:: 97 | *~Left:: 98 | *~Right:: 99 | *~Up:: 100 | *~Down:: 101 | *~Enter:: 102 | *~PrintScreen:: 103 | *~Delete:: 104 | *~Home:: 105 | *~End:: 106 | *~PgUp:: 107 | *~PgDn:: 108 | Return 109 | 110 | ; 上部メニューがアクティブになるのを抑制 111 | *~LAlt::Send {Blind}{vk07} 112 | *~RAlt::Send {Blind}{vk07} 113 | 114 | ; 左 Alt 空打ちで IME を OFF 115 | LAlt up:: 116 | if (A_PriorHotkey == "*~LAlt") 117 | { 118 | IME_SET(0) 119 | } 120 | Return 121 | 122 | ; 右 Alt 空打ちで IME を ON 123 | RAlt up:: 124 | if (A_PriorHotkey == "*~RAlt") 125 | { 126 | IME_SET(1) 127 | } 128 | Return 129 | --------------------------------------------------------------------------------