IME変換前のテキストを入力する
- 題名: IME変換前のテキストを入力する
- 著者: たいちう
- 日時: 2010/04/15 16:53:46
- ID: 26709
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: IME変換前のテキストを入力する
- 著者: 魔界の仮面弁士
- 日時: 2010/04/15 19:27:37
- ID: 26711
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: IME変換前のテキストを入力する
- 著者: たいちう
- 日時: 2010/04/16 10:07:35
- ID: 26716
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.NET]
以前お世話になりました、たいちうと申します。
【やりたいこと】
今回は「かな」と「漢字」を続けて入力するシステムで、入力の省力化を要求されています。
ユーザーが入力した「かな」を、次の「漢字」テキストボックスにコピーし、
漢字に変換したいのです。
例)田中と入力する場合
1.「かな」テキストボックスに"たなか"と入力。
2.「漢字」テキストボックスにフォーカスが移ると、"たなか"と表示。
3.スペースを押すことで、"田中"と変換される。
【試したこと】
http://w3.sfdata.ne.jp/ML/VB/msg14810.html を参考に次のソースコードを
試したところ、ImmSetCompositionStringでfalseが返ってきてしまいます。
Form1にTextBox1とTextBox2を貼り付ける。
'「入力コンテキスト」を取得する
Private Declare Function ImmGetContext Lib "imm32.dll" _
(ByVal hWnd As Int32) As Int32
'IMEを開く(あるいは閉じる)
Private Declare Function ImmSetOpenStatus Lib "imm32.dll" _
(ByVal hIMC As Int32, ByVal fOpen As Int32) As Int32
'ImmSetCompositionString APIのdwIndex
Private Enum eSCS
'変換文字列か読み文字列のいずれか、またはその両方を設定
SCS_SETSTR = &H9
'変換文字列か読み文字列のいずれか、またはその両方の属性を設定
SCS_CHANGEATTR = &H11
'変換文字列か読み文字列のいずれか、またはその両方の文節情報を設定
SCS_CHANGECLAUSE = &H24
'IMEにRECONVERTSTRING 構造体に格納された文字列を逆変換するよう指示
SCS_SETRECONVERTSTRING = &H10000
'IMEにRECONVERTSTRING構造体を調整するよう指示
SCS_QUERYRECONVERTSTRING = &H20000
End Enum
'変換文字列および読み文字列の文字、属性、または文節を設定
Private Declare Function ImmSetCompositionString Lib "imm32.dll" _
Alias "ImmSetCompositionStringA" _
(ByVal hIMC As Int32, _
ByVal dwIndex As eSCS, _
ByVal lpComp As Char(), _
ByVal dwCompLen As Int32, _
ByVal lpRead As Object, _
ByVal dwReadLen As Int32) As Int32
'「入力コンテキスト」を解放する
Private Declare Function ImmReleaseContext Lib "imm32.dll" _
(ByVal hWnd As Int32, ByVal hIMC As Int32) As Int32
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TextBox1.Text = "へんかんまえのかんじ"
TextBox2.Text = ""
End Sub
Private Sub TextBox2_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox2.GotFocus
Try
Dim strKana As String= TextBox1.Text
Dim intLen As Integer = StrConv(strKana, vbHiragana).Length
Dim hIMC As Integer = ImmGetContext(TextBox2.Handle.ToInt32)
TextBox2.Text = ""
If hIMC <> 0 Then
Dim r As Boolean = ImmSetOpenStatus(hIMC, 1)
Debug.WriteLine("result of ImmSetOpenStatus : " & r.ToString)
Dim buf() As Char = strKana.ToCharArray()
r = ImmSetCompositionString(hIMC, eSCS.SCS_SETSTR, buf, intLen, vbNullString, 0)
Debug.WriteLine("result of ImmSetCompositionString : " & r.ToString)
ImmReleaseContext(TextBox2.Handle.ToInt32, hIMC)
End If
Catch ex As Exception
Debug.WriteLine(ex.ToString)
End Try
End Sub
【質問】
WinApiの呼び出し方が間違っているのだと思うのですが、
VB .NET 2003ではどのように書くのが正解なのか判りませんでした。
どなたかお教えいただけないでしょうか。
よろしくお願いします。