[リストへもどる]
一括表示

投稿時間: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>
-------------------------ここまで

以上、デバッグでなかなか原因がつかめなかったので、ご報告まで。

投稿時間:2002/10/12(Sat) 21:13
投稿者名:NAO★
Eメール:
URL :
タイトル:
Re: コンボにIMEから日本語入力できない 【バグ報告】
以前書いた、これなんですが気になる記事を見つけました。
宇宙仮面さんのC#プログラミングのページに次のような記述がありました。
http://isweb41.infoseek.co.jp/computer/ukamen/CSBugs.htm

> SelectionStart,SelectionLengthに関してWinXPとWin98SEで動作が異なります。
> WinXPは半角文字、全角文字共に1文字として扱います。
> Win98SEは半角文字は1文字、全角文字は2文字として扱うようです

ひょっとしたら、このあたりが関係しているのかもしれません。