5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-02-23

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

では!

5
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?