- PR -

テキストボックスに入力された平仮名を漢字へ変換

1
投稿者投稿内容
hidekazu
会議室デビュー日: 2002/05/10
投稿数: 9
投稿日時: 2003-03-05 18:20
現在、キーボードを使用せずに独自の入力パッドを作成し、
ペンを使って文字を入力する方法を検討しています。
(WinXP TabletPC Edition)

そこで問題になるのが、漢字の入力なのですが、
テキストボックスに入力された平仮名を漢字へ変換する方法で
つまずいています。
「imm32.dll」を使って出来ると思っているのですが、
全然上手く行きません。

誰かこの様なことをされた方や、サンプル等が配布されているサイトを
ご存知でしたら、具体的にどのようにコーディングすれば良いか
教えていただけますでしょうか?

よろしくお願いします。
二天
ベテラン
会議室デビュー日: 2001/09/26
投稿数: 60
投稿日時: 2003-03-05 22:28
どのようにうまく行かないのか不明ですが、通常のWindowsXPの場合、imm32.dllの以下の関数を順番に呼び出すだけです。
ImmGetContext
ImmSetCompositionString
ImmReleaseContext

サンプルに関しては、サーチエンジンで「imm32 変換」で調べればVC++、VB6のコードがそれなりに出てくるはずです。
hidekazu
会議室デビュー日: 2002/05/10
投稿数: 9
投稿日時: 2003-03-07 11:31
返信ありがとうござます。

immSetCompositionStringが正常の時には0以外の値を返すはずなのですが、
0が返ってしまいます。(ソースは以下の通り)

インターネットでもしらべてみたのですが、結局分かりませんでした。

何か良い方法は無いでしょうか?

Private Sub Command1_Click()
'同じフォームにあるText1に入力した平仮名を漢字変換します。
'(最終的には変換の候補リストを取得したい)
Dim hwnd As Long
Dim strInput As String
Dim intInputLn As Integer

Debug.Print "Me.Text1.hwnd = " & Me.Text1.hwnd
hwnd = ImmGetContext(Me.Text1.hwnd)
strInput = Me.Text1.Text
intInputLn = LenB(StrConv(strInput, vbFromUnicode))
Debug.Print "hwnd = " & hwnd
Debug.Print "strInput = " & strInput
Debug.Print "intInputLn = " & intInputLn
Debug.Print "SCS_SETSTR = " & SCS_SETSTR
Debug.Print "ImmSetCompositionString = " & ImmSetCompositionString(hwnd, SCS_SETSTR, strInput, intInputLn, vbNullString, 0)

Debug.Print "ImmNotifyIME1 = " & ImmNotifyIME(hwnd, NI_COMPOSITIONSTR, CPS_CONVERT, 0) '変換実行
Debug.Print "ImmNotifyIME2 = " & ImmNotifyIME(hwnd, NI_OPENCANDIDATE, 0, 0) '変換候補リスト表示

Debug.Print "ImmReleaseContext = " & ImmReleaseContext(Me.Text1.hwnd, hwnd)
End Sub
二天
ベテラン
会議室デビュー日: 2001/09/26
投稿数: 60
投稿日時: 2003-03-07 13:46
> immSetCompositionStringが正常の時には0以外の値を返すはずなのですが、
> 0が返ってしまいます。(ソースは以下の通り)

私のコードはPanelのサブクラスでATOK12を使っていますが、成功しています。ただし、他の環境については知りません。
その上で気になった点をいくつか挙げます。

1. IMEのモードがONになっていないと0を返す。
ImeMode = ImeMode.On;
2. ImmGetContextで取得するハンドルはIntPtr型に入れるべきのはず。
3. 全角文字は2文字扱いのはず。ちなみにImmSetCompositionStringでの型はUInt32。
4. SCS_SETSTRの値は 0x0001|0x0008 。
5. 私のコードではImmSetCompositionStringで文字列を指定する際にStringではなく、System.Text.StringBuilderを使用している。
6. ATOK12では、Updateモジュールを入れないとうまく動作しなかった。
以上

[ メッセージ編集済み 編集者: 二天 編集日時 2003-03-07 16:30 ]
1

スキルアップ/キャリアアップ(JOB@IT)