プログラミング: 2021年11月アーカイブ

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 って書いてやってもいいと思うけど。

このアーカイブについて

このページには、2021年11月以降に書かれたブログ記事のうちプログラミングカテゴリに属しているものが含まれています。

前のアーカイブはプログラミング: 2021年3月です。

次のアーカイブはプログラミング: 2021年12月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら