投稿日 | : 2002/09/21(Sat) 01:13 |
投稿者 | : NAO★ |
Eメール | : |
URL | : |
タイトル | : コンボにIMEから日本語入力できない 【バグ報告】 |
【現象】
コンボボックスでオートフィル機能を実現しようとMSDNを参考に
プログラムを作ったのですが、Windows XPでIMEから日本語入力しようと
しても文字ができない。
Private Sub Combo1_Change()
でコンボに入力された文字を調べたところ
IMEからコンボに受け取った文字が後ろから渡されていた
あいうえお→おえういあ
なお、オートフィル機能を利用しない場合はこの現象は起きなかった
【環境】
Windows XP
VB6.0(SP5)
【原因】
調べたところ、コントロールの形状をWindows XP形式にする
manifest ファイルを利用するとこの現象が起こることが判明しましたので報告します。
【対策】
manifest を利用しない
(manifestファイルを削除するだけでOK)
【再現方法】
フォームにコンボコントロールを追加。
Form モジュールに記述
-----------------------------ここから
'オートフィル機能を実現する
' コンボのリスト内部を文字検索する
Private Const CB_FINDSTRING = &H14C
'コンボで削除(DEL、BS)キーが押されたかどうかを調べるフラグ
Private pressKey As Boolean
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
lParam As Any) As Long
Private Sub Combo1_Change()
Dim iStart As Integer
Dim sString As String
Static iLeftOff As Integer
If pressKey = True Then
pressKey = False
Exit Sub
End If
'Combo1.SelStart の値を保持するため iStart に格納します。
iStart = Combo1.SelStart
If iLeftOff <> 0 Then
Combo1.SelStart = iLeftOff
iStart = iLeftOff
End If
'入力した文字の右に文字があっても、現在入力位置で候補検索をします。
sString = CStr(Left$(Combo1.Text, iStart))
'SendMessage は、入力した文字が候補群になかった場合、-1 を返します。
Combo1.ListIndex = SendMessage(Combo1.hwnd, CB_FINDSTRING, -1, ByVal sString)
If Combo1.ListIndex = -1 Then
'sStringには、入力した文字列が先頭から格納されています。
'iLeftOffには、入力した文字数が格納されます。
iLeftOff = Len(sString)
Combo1.Text = sString
End If
'保持していた SelStart の値を元に戻します。
Combo1.SelStart = iStart
Combo1.SelLength = Len(Combo1.Text)
iLeftOff = 0
End Sub
Private Sub Combo1_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyDelete Or KeyCode = vbKeyBack Then
pressKey = True
End If
End Sub
------------------ここまで
同じディレクトリに "プログラム名.exe.manifest" というテキストファイルをつくる。
manifestファイルの中身:文字コードをUTF-8で保存:プログラム名は適時変えてください
----------------------------ここから
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.2.0" processorArchitecture="X86"
name="hoehoedarkside.nao-star.test.exe" type="win32" />
<description></description>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0" processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df" language="*" />
</dependentAssembly>
</dependency>
</assembly>
-------------------------ここまで
以上、デバッグでなかなか原因がつかめなかったので、ご報告まで。