カタカナを自動で表示するには?

解決


AZ  2004-06-08 13:46:41  No: 83901  IP: [192.*.*.*]

VB.NETにて、テキストボックスに入力された(氏名)のカタカナを
他のテキストボックスに自動で表示したいのです。

6.0の時は、APIを使用しIMM32より取得できましたが
.NETでは、AS ANY は使用できない。
'*********************************************
' 変換文字列に関する情報を取得する関数の宣言
Declare Function ImmGetCompositionString _
    Lib "imm32.dll" _
    Alias "ImmGetCompositionStringA" _
   (ByVal hIMC As Long, _
    ByVal dwIndex As Long, _
    lpBuf As Any, _   '<-------------ここ
    ByVal dwBufLen As Long) As Long
'*********************************************
strBuffer の固定長バッファもエラーになります。
'*********************************************
Private Sub txt氏名_Change(Index As Integer)
    Dim lngImeContext As Long
    Dim strBuffer     As String * 256    '<-----
    Dim strFurigana   As String
    Dim lngResult     As Long
    
    ' 入力コンテキストを取得
    lngImeContext = _
        ImmGetContext(txt氏名(Index).hWnd)
    ' 変換文字列に関する情報を取得
    lngResult = _
        ImmGetCompositionString( _
            lngImeContext, _
            GCS_RESULTREADSTR, _
            ByVal strBuffer, _
            Len(strBuffer))
    ' 入力コンテキストを解放
    lngResult = _
        ImmReleaseContext( _
            txt氏名(Index).hWnd, _
            lngImeContext)
    ' 取得した文字列からNull文字を削除
    strFurigana = Replace(strBuffer, vbNullChar, "")
    ' 取得した文字列からスペースを削除
    strFurigana = Replace(strFurigana, " ", "")
    ' 結果を表示
    
    
    If strFurigana <> カナ退避 Then
        txtカナ(Index).Text = txtカナ(Index).Text & strFurigana
        カナ退避 = strFurigana
    End If
    
End Sub
'***********************************************
よろしくお願いいたします。

編集 削除
nanashi  2004-06-08 14:22:33  No: 83902  IP: [192.*.*.*]

私はVB6.0でAnyも固定長文字列も使用しないで使っていますが。

Declare Function ImmGetCompositionString _
    Lib "imm32.dll" Alias "ImmGetCompositionStringA" _
    (ByVal hImc As Long, ByVal dw As Long, ByVal lpv As String, ByVal dw2 As Long) _
        As Long

.NETならLongをIntegerにすればイイかと。

編集 削除
AZ  2004-06-08 14:50:59  No: 83903  IP: [192.*.*.*]

nanashiさんありがとうございます。
Integerにしてもだめです。
Ipv = Nothing です。

編集 削除
nanashi  2004-06-08 17:17:49  No: 83904  IP: [192.*.*.*]

簡単に試しましたが下記で出来ました。
.NETはまだ不慣れなんで書き方は微妙ですが…。

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        Dim hWnd, hImc, iLen As Integer
        Dim sBuff As String

        hWnd = CType(sender, TextBox).Handle.ToInt32
        hImc = ImmGetContext(hWnd)

        iLen = ImmGetCompositionString(hImc, GCS_RESULTREADSTR, vbNullChar, 0) + 1

        sBuff = Space(iLen)

        Call ImmGetCompositionString(hImc, GCS_RESULTREADSTR, sBuff, iLen)

        Call ImmReleaseContext(hWnd, hImc)

        Label1.Text = sBuff
    End Sub

編集 削除
AZ  2004-06-08 18:55:32  No: 83905  IP: [192.*.*.*]

nanashiさんありがとうございます。
おかげさまで解決しました。
本当に良い掲示板ですね。
これからもお世話になります。
ありがとうございました。

編集 削除