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

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

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

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

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

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

setimestat 状態
状態変換状態(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
27
28
29
30
31
32
33
34
35
36
37
38
	ll_libload imm, "imm32.dll"
	ll_getproc ImmGetContext, "ImmGetContext", imm
	ll_getproc ImmReleaseContext, "ImmReleaseContext", imm
	ll_getproc ImmSetOpenStatus, "ImmSetOpenStatus", 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 setimestat int
	mref mode, 0
	prm = himc, (mode ! 0)
	ll_callfunc prm, 2, ImmSetOpenStatus@
	return
#global

	initime
	sdim buf, 32
	objsize 100, 25
	combox ime, , "無変換\n変換"
	button "変更する", *change
	input buf
	stop

*change
	objsel 2
	setimestat ime
	stop

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

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

setimestat 状態
状態変換状態(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
27
28
29
30
31
#uselib "imm32.dll"
#cfunc global ImmGetContext "ImmGetContext" int
#func  global ImmSetOpenStatus "ImmSetOpenStatus" int, int
#func  global ImmReleaseContext "ImmReleaseContext" int, int

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

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

#deffunc setimestat int mode
	ImmSetOpenStatus himc, mode ! 0
	return
#global

	initime
	sdim buf, 32
	objsize 100, 20
	combox ime, , "無変換\n変換"
	button gosub "変更する", *change
	input buf
	stop

*change
	setimestat ime
	objsel 2
	return