- - PR -
IME 変換候補取得について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2008-02-07 00:39
はじめまして。
VB2005で、かな→漢字へ変換をし、変換候補を取得しようと取り組んでいます。 現在、IME API ImmGetConversionList関数を使用し、変換候補を取得しています。 しかし、ImmGetConversionListは、取得結果の文字化け、明らかに候補数が少ない、 実行する度に取得できる変換候補数にバラつきが生じてしまいます。 そのため、正確な変換候補を取得できません。 ImmGetConversionListは、一体IMEのどこから変換候補を取得しているのでしょうか。 C# ですが、ImmGetCandidateListという関数では、IMEの変換時に表示される候補を そのまま取得出来る様でした。 初心者で申し訳ございません。 ImmGetConversionListについて、何を取得しているのか。何か原因がお分かりの方が いらっしゃいましたら、どうぞよろしくお願い致します。 プログラムは以下の通りです。 Public Declare Function ImmGetConversionList Lib "imm32.dll" _ Alias "ImmGetConversionListA" (ByVal hKL As IntPtr, ByVal hIMC As IntPtr,_ ByVal lpSrc As String, ByRef lpCandidateList As Byte,_ ByVal dwBufLen As Integer, ByVal uFlag As Integer) As Integer PublicDeclare Function ImmGetDefaultIMEWnd Lib "imm32.dll" _ (ByVal hWnd As System.IntPtr) As Integer <DllImport("Imm32.dll", CharSet:=CharSet.Auto, entrypoint:="ImmGetContext")> _ Public Shared Function ImmGetContext(ByVal hWnd As IntPtr) As IntPtr End Function <DllImport("Imm32.dll", CharSet:=CharSet.Auto, entrypoint:="ImmReleaseContext")> _ Public Shared Function ImmReleaseContext(ByVal hWnd As IntPtr, ByVal hIMC As IntPtr) As Boolean End Function Public Structure CANDIDATELIST Public dwSize As Long Public dwStyle As Long Public dwCount As Long Public dwSelection As Long Public dwPageStart As Long Public dwPageSize As Long Public dwOffset As Long ' End Structure 'CANDIDATELIST Dim hKL As Long Dim bytBuf() As Byte Dim strSource As String Dim hwndIME As Long Dim himc As System.IntPtr Dim lngLen As Integer Dim lngRet As Long Dim udtCandList As CANDIDATELIST Dim bytCand() As Byte strSource = Trim(moji) If Microsoft.VisualBasic.Strings.Len(strSource) > 0 Then hKL = GetKeyboardLayout(0) hwndIME = ImmGetDefaultIMEWnd(MyTextBoxSK1.Handle) himc = ImmGetContext(hwndIME) Call ImmSetOpenStatus(himc, 1) If himc Then ReDim bytBuf(0) lngLen = ImmGetConversionList(hKL, himc, strSource, bytBuf(0), 0, GCL_ENUM.GCL_CONVERSION) If lngLen > 0 Then ReDim bytBuf(lngLen - 1) strSource = Microsoft.VisualBasic.Strings.Trim(moji) lngRet = ImmGetConversionList(hKL, himc, strSource, bytBuf(0), lngLen, GCL_ENUM.GCL_CONVERSION) If lngRet Then udtCandList.dwSize = bytBuf(0) udtCandList.dwStyle = bytBuf(4) udtCandList.dwCount = bytBuf( udtCandList.dwSelection = bytBuf(12) udtCandList.dwPageStart = bytBuf(16) udtCandList.dwPageSize = bytBuf(20) udtCandList.dwOffset = bytBuf(24) ReDim bytCand(lngRet - udtCandList.dwOffset) For i = udtCandList.dwOffset To lngRet - 1 bytCand(j) = bytBuf(i) j = j + 1 Next For k = 0 To udtCandList.dwCount + 1 Dim str As String = System.Text.Encoding.Default.GetString(bytCand) Dim par As Char() = CType(ControlChars.NullChar, String).ToCharArray() Dim strList As String() = str.Split(par) ListBox1.Items.Add(strList(k)) Next ー中略ー Call ImmReleaseContext(hwndIME, himc) End If End If End If |
|
投稿日時: 2008-02-07 09:31
ImmGetConversionListは、IMEの変換候補一覧を取得するわけではありません。
変換候補一覧を取得するには、ImmGetCandidateListを使用します。 で、ImmGetConversionListは一体何を取得しているのかですが・・・ 確か、変換履歴を取得したような・・・??? 文字化けについては、IMEのバージョンやOSのバージョンにより 特定の状況下で発生することがMSによって認識されてます。 http://support.microsoft.com/kb/417262/ja http://support.microsoft.com/kb/417218/ja 【参考URL等追加】 [ メッセージ編集済み 編集者: くまっち 編集日時 2008-02-07 09:36 ] |
|
投稿日時: 2008-02-07 11:40
くまっちさん、書き込みありがとうございます!
やはり変換候補一覧を取得するにはImmGetCandidateListを使用するのですね。 文字化けは、どうしようもない様ですね。 もう少し何を取得しているのか探ってみます! 本当ありがとうございました! |
|
投稿日時: 2008-02-07 12:22
詳しく調べきれてませんが・・・
ちょっと試した結果・結論を記述しておきます。 「あ」→「唖」変換後、「あ」でImmGetConversionList実行結果の先頭データは「唖」 「あ」→「亞」変換後、「あ」でImmGetConversionList実行結果の先頭データは「亞」 そしてIMEの学習機能を「なし」に設定後 「あ」→「唖」変換し、「あ」でImmGetConversionList実行結果の先頭データは「亞」 以後、「あ」を色々変換しても、「あ」でImmGetConversionList実行結果は固定で 変動することはなくなりました。 この事から、ImmGetConversionListの挙動としては システム辞書から変換候補を取得するのではなく、 IMEの学習結果を元に変換候補を取得しているのではないかと思います。 *これはあくまで私の環境にて試した結果からの推論です。 【訂正】 IMEの学習結果ではなく、ユーザー辞書です。 [ メッセージ編集済み 編集者: くまっち 編集日時 2008-02-07 12:55 ] |
|
投稿日時: 2008-02-07 14:53
くまっちさん、ありがとうございます!
くまっちさんの書き込み通り実行したところ、私の環境でも変換した後、 ImmGetConversionList実行結果の先頭にデータに同じ文字が並ぶことが分かりました。 しかし、学習機能をなしに設定しても同様の現象が起こるようです。 ImmGetConversionListは、変換履歴をみていることは確かですね! ありがとうございます! |
1