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 = &H0Private Const IME_CMODE_NATIVE As Integer = &H1Private Const IME_CMODE_JAPANESE As Integer = IME_CMODE_NATIVEPrivate Const IME_CMODE_KATAKANA As Integer = &H2Private Const IME_CMODE_LANGUAGE As Integer = &H3Private Const IME_CMODE_FULLSHAPE As Integer = &H8Private Const IME_CMODE_ROMAN As Integer = &H10' 文字モードPrivate Const IME_SMODE_NONE As Integer = &H0Private Const IME_SMODE_PLAURALCLAUSE As Integer = &H1Private Const IME_SMODE_SINGLECONVERT As Integer = &H2Private Const IME_SMODE_AUTOMATIC As Integer = &H4Private 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 って書いてやってもいいと思うけど。