5
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

IMEの状態をゲット出来るようになるまでのノンプログラマー的冒険(AutoHotkey)

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を使ってコードに組み込んでいけばいいわけです.
そう,あなたがノンプログラマーならね···.プログラマーの人はちゃんとセットの方も出来そうでうらやましいです.

では!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
5
Help us understand the problem. What are the problem?