#IMEの状態をゲット出来るようになるまでのノンプログラマー的冒険
neokix
#そもそものスタンス
私はノンプログラマーなのであまりよくわからないのですが(なぜここにいる),IMEの設定をAutoHotkeyから行うには,IME.ahkというライブラリを使うように勧められることが多いようです.
karakaram/alt-ime-ahk : https://github.com/karakaram/alt-ime-ahk
ですが,ライブラリは便利な一方,どう動いているかが分かりにくい.
ということで,あんまり使いたくない.
まぁそんなことを言い出したら,AutoHotkeyでさえライブラリ的ではないかという議論はさておき.
#試したこと1
最初に試したことは,PixelGetColorでIME部分の[あ]→[A]の色の違う部分を得ようという極めてジャンキーな方法です.
これ,うまくいきません.ご注意を.
ただし,他のプログラムではジャンキーな方法としてはいいと思います.Adobe Premier Proでそのような方法をしているかたを知っています.
#試したこと2
IME.ahkを分解してみる.
しかし,うまくいきませんでした.
どこが何を指しているのか,どう動いているのか,さっぱりなのです.
ここでノンプログラマーである私は独学ゆえの浅学を思い知ることになります.
#試したこと3
平昌オリンピック カーリング 女子日韓戦をエンド1から11までしっかり見て,勇気をもらう.
#試したこと4→とりあえずの解決策
ググる.
すると,こちらに行きつきました.
(AutoHotkey)(IMEの制御をする 編) - もらかなです。 : http://d.hatena.ne.jp/morakana/20080213/1202876561
少し詳し目に説明されています.ラッキー!
ということで,以下のように抽出できました.
F1::
WinGet, vcurrentwindow, ID, A
vimestate := DllCall("user32.dll\SendMessageA", "UInt", DllCall("imm32.dll\ImmGetDefaultIMEWnd", "Uint", vcurrentwindow), "UInt", 0x0283, "Int", 0x0005, "Int", 0)
Msgbox, %vimestate% `n 0はOFF `n 1はON
return
詳しくはよくわからないのですが(詳しい方解説おねがいします),ひとつめのDllCallでIMEからどの部分を抜き出すかを指定し,中にさらに入っているDllCallでIMEの状態をvcurrentwindowという変数に入れているようです.
IMEの現在の状態が分かればこっちのものです.ノンプログラマーの方法でLabelをつけていきます.
そもそもの発端はvkf3/vkf4がトグるところなんですよね···.
なんとかならないかなー.
F1::
imeon:
Gosub, IMEGetstate
If (vimestate=1) ;imeがonなら
{
;ONだからなにもしない
}
else
{
Send, {vkf3} ;全角/半角ボタン
}
return
F2::
imeoff:
Gosub, IMEGetstate
If (vimestate=0) ;imeがoffなら
{
;Offだから何もしない
}
else
{
Send, {vkf3}
}
return
IMEGetstate:
DetectHiddenWindows, ON
WinGet, vcurrentwindow, ID, A
vgetdefault := DllCall("imm32.dll\ImmGetDefaultIMEWnd", "Uint", vcurrentwindow)
vimestate := DllCall("user32.dll\SendMessageA", "UInt", vgetdefault, "UInt", 0x0283, "Int", 0x0005, "Int", 0)
DetectHiddenWindows, Off
return
···スパゲッティーコード?すみません.
ホームポジションに引きこもりたい方は,F1/F2を変換/無変換などに割り当てるのもよいでしょうね.
これでライブラリを使わずにコードを組み込めますね.あとはGosubを使ってコードに組み込んでいけばいいわけです.
そう,あなたがノンプログラマーならね···.プログラマーの人はちゃんとセットの方も出来そうでうらやましいです.
では!