- PR -

IME 変換候補取得について

1
投稿者投稿内容
mimi
会議室デビュー日: 2008/02/07
投稿数: 3
投稿日時: 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/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 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 ]
mimi
会議室デビュー日: 2008/02/07
投稿数: 3
投稿日時: 2008-02-07 11:40
くまっちさん、書き込みありがとうございます!

やはり変換候補一覧を取得するにはImmGetCandidateListを使用するのですね。

文字化けは、どうしようもない様ですね。
もう少し何を取得しているのか探ってみます!
本当ありがとうございました!
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-02-07 12:22
詳しく調べきれてませんが・・・
ちょっと試した結果・結論を記述しておきます。

「あ」→「唖」変換後、「あ」でImmGetConversionList実行結果の先頭データは「唖」
「あ」→「亞」変換後、「あ」でImmGetConversionList実行結果の先頭データは「亞」

そしてIMEの学習機能を「なし」に設定後
「あ」→「唖」変換し、「あ」でImmGetConversionList実行結果の先頭データは「亞」
以後、「あ」を色々変換しても、「あ」でImmGetConversionList実行結果は固定で
変動することはなくなりました。

この事から、ImmGetConversionListの挙動としては
システム辞書から変換候補を取得するのではなく、
IMEの学習結果を元に変換候補を取得しているのではないかと思います。

*これはあくまで私の環境にて試した結果からの推論です。

【訂正】
IMEの学習結果ではなく、ユーザー辞書です。

[ メッセージ編集済み 編集者: くまっち 編集日時 2008-02-07 12:55 ]
mimi
会議室デビュー日: 2008/02/07
投稿数: 3
投稿日時: 2008-02-07 14:53
くまっちさん、ありがとうございます!

くまっちさんの書き込み通り実行したところ、私の環境でも変換した後、
ImmGetConversionList実行結果の先頭にデータに同じ文字が並ぶことが分かりました。
しかし、学習機能をなしに設定しても同様の現象が起こるようです。

ImmGetConversionListは、変換履歴をみていることは確かですね!
ありがとうございます!
1

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