API 叩いて無理やり IME モードを変更する方法[プログラミング]
(2021-11-24 14:25:14) by shinoda


VB.NETのプログラムで、GrapeCity MultiRow の表内の項目の値をコピーし、表外の項目にペーストしたとき、その項目のディフォルトの IME モードが「ひらがな変換」モードで指定されているのに、なぜか「ひらがな無変換」モードになってしまう。
ローマ字入力でひらがなは入力できるが、変換キー(スペースなど)を押しても変換しない。

どうも GrapeCity MultiRow がらみの既存のバグみたい。MultiRow内で設定された IME の状態を VB.NET が自動でクリアできず(?)、表外の項目に設定した IME Mode に戻らないようである。

ということで Windows に用意されている Win32 API(具体的には IMM32.dll の ImmSetConversionStatus)を叩いて MultiRow の表から Leave した時のイベントで強引に IME Mode をセットしてみることにした。

ImmSetConversionStatus には変換モードと文字モードを設定しないといけない。

' 変換モード
Private Const IME_CMODE_ALPHANUMERIC As Integer = &H0
Private Const IME_CMODE_NATIVE As Integer = &H1
Private Const IME_CMODE_JAPANESE As Integer = IME_CMODE_NATIVE
Private Const IME_CMODE_KATAKANA As Integer = &H2
Private Const IME_CMODE_LANGUAGE As Integer = &H3
Private Const IME_CMODE_FULLSHAPE As Integer = &H8
Private Const IME_CMODE_ROMAN As Integer = &H10

' 文字モード
Private Const IME_SMODE_NONE As Integer = &H0
Private Const IME_SMODE_PLAURALCLAUSE As Integer = &H1
Private Const IME_SMODE_SINGLECONVERT As Integer = &H2
Private Const IME_SMODE_AUTOMATIC As Integer = &H4
Private Const IME_SMODE_PHRASEPREDICT As Integer = &H8

変換モード JAPANESE で文字モード AUTOMATIC で良いのかなと思って、

Win32apiResultCode = ImmSetConversionStatus(Handle, IME_CMODE_JAPANESE, IME_SMODE_AUTOMATIC)

ってすると、「全角ひらがな」ではなく「半角カタカナ」で IME が起動する。
ん???と思って、じゃあ全角指定すればいいのか?と、

Win32apiResultCode = ImmSetConversionStatus(Handle, IME_CMODE_FULLSHAPE, IME_SMODE_AUTOMATIC)

とすると、「全角英数字」で起動した。

これ、ビットの 0,1の組み合わせなのね?
「日本語」は 1桁目に 1が立ってるから &H1(0b0001)、「全角」は 4桁目に 1が立ってるから &H8(0b1000)。
こいつを OR演算したものをセットするのだった。0b0001 OR 0b1000 で 0b1001(10進の 9)をセットしてやればいいみたい。

というわけで、

Win32apiResultCode = ImmSetConversionStatus(Handle, IME_CMODE_JAPANESE Or IME_CMODE_FULLSHAPE, IME_SMODE_AUTOMATIC)

と書いてやれば、ばっちり「ひらがな変換」モードで起動された。IME_CMODE_JAPANESE Or IME_CMODE_FULLSHAPE のところは、10進数で 9 って書いてやってもいいと思うけど。

コメント投稿
次の記事へ >
< 前の記事へ
TOPへ戻る

Powered by
MT4i 3.0.8