〜 インプット 〜
IMEの状態を取得 (要IMM32.DLL)

Windowsには「nputethodditor(=IME)」と呼ばれる
「nputethodanager(=IMM)」で管理された文字入力補助ソフトウェアが入ってます。
Windowsでのキーボードから入力された文字は全てIMMの管理下にあり、
提供されているIME用のAPIを使って制御することができるようになっています。

「半角/全角」キーを押した時のIMEの状態がON・OFFいずれであるか状態を取得するときは
IME32.DLLのAPI関数の1つであるImmGetOpenStatusを使用するのですが、
API関数ImmGetOpenStatusの引数に指定するのは「入力コンテキストハンドル」であり、
この入力コンテキストは別途API関数ImmGetContextから取得しなければわからないので、
先に「利用するウィンドウハンドル」を引数にしたAPI関数ImmGetContextを使って取得しておきましょう。
そして、ココで取得できた入力コンテキストを引数にAPI関数ImmGetOpenStatusを呼びます。
取得した状態がOFFなら0が、ONなら1がそれぞれ返りますので、状態に応じた処理を行いましょう。
尚、API関数ImmGetContextを利用した時は必ず解放する必要があるとのことなので、
呼び出した直後にでも忘れないうちにAPI関数ImmReleaseContextを使って解放しておきましょう。
引数に指定するのは「利用するウィンドウハンドル」「入力コンテキストハンドル」の2つです。

下記は、入力コンテキストハンドルの取得及び解放と変換状態の取得までをセットにしたモジュールです。
具台的な使い方についてはサンプルを参照してください。
	

initime
[パラメータなし]モジュール内部で共通使用する情報をセットするだけである為、パラメータは必要ない。

exitime
[パラメータなし]モジュール内部で共通使用した情報を開放するだけである為、パラメータは必要ない。
尚、プログラム終了時に自動的に呼び出されるものなので明示的に呼び出さなくても良い。

getimestat
[パラメータなし]変換状態を取得するだけのため、パラメータは必要ない。
尚、取得した状態(0:無変換, 1:変換)はstatに返る。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
	ll_libload imm, "imm32.dll"
	ll_getproc ImmGetContext, "ImmGetContext", imm
	ll_getproc ImmGetOpenStatus, "ImmGetOpenStatus", imm
	ll_getproc ImmReleaseContext, "ImmReleaseContext", imm

#module
#deffunc initime
	mref bmscr, 67
	ll_callfunc bmscr.13, 1, ImmGetContext@ : ll_ret himc
	return himc

#deffunc exitime onexit
	if himc {
		mref bmscr, 67
		prm = bmscr.13, himc
		ll_callfunc prm, 2, ImmReleaseContext@
	}
	return

#deffunc getimestat
	mref stt, 64
	ll_callfunc himc, 1, ImmGetOpenStatus@ : ll_ret prm : stt = prm
	return
#global

	initime
	sdim buf, 32
	input buf, 100
	sdim mode, 16, 2
	mode = "開いていません", "開いています"
	repeat
		getimestat
		title "現在IMEを" + mode.stat
		wait 10
	loop

initime
[パラメータなし]モジュール内部で共通使用する情報をセットするだけである為、パラメータは必要ない。

exitime
[パラメータなし]モジュール内部で共通使用した情報を開放するだけである為、パラメータは必要ない。
尚、プログラム終了時に自動的に呼び出されるものなので明示的に呼び出さなくても良い。

状態 = getimestat( )
状態取得した変換状態(0:無変換, 1:変換)の受取先を指定する。
[パラメータなし]変換状態を取得するだけのため、パラメータは必要ない。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#uselib "imm32.dll"
#cfunc global ImmGetContext "ImmGetContext" int
#cfunc global ImmGetOpenStatus "ImmGetOpenStatus" int
#func  global ImmReleaseContext "ImmReleaseContext" int, int

#module
#deffunc initime
	himc = ImmGetContext(hwnd)
	return himc

#deffunc exitime onexit
	if himc : ImmReleaseContext hwnd, himc
	return

#defcfunc getimestat
	return ImmGetOpenStatus(himc)
#global

	initime
	sdim buf, 32
	input buf
	mode = "開いていません", "開いています"
	repeat
		title "現在IMEを" + mode.getimestat()
		wait 10
	loop