使用日语IME VB.net处理文本框中的关键事件

使用日语IME VB.net处理文本框中的关键事件,vb.net,ime,Vb.net,Ime,我正在使用一个文本框,它为日语启用了输入法 由于这允许您键入罗马字符,然后从汉字或假名列表中进行选择,因此在您通过按enter键进行选择之前,实际文本不会输入文本框 我希望能够处理非文本键,如左箭头和右箭头、加法、减法,但KeyUp/Down事件都将按下的键视为值为229的ProcessCommandKey。IME似乎拥有对输入的所有控制权。我没有从KeyEventArgs中看到任何进一步的数据 当IME处于活动状态时,如何从事件中检查键的实际值(左、右等) 谢谢。 当你在寻找替代品(如果我很好

我正在使用一个文本框,它为日语启用了输入法

由于这允许您键入罗马字符,然后从汉字或假名列表中进行选择,因此在您通过按enter键进行选择之前,实际文本不会输入文本框

我希望能够处理非文本键,如左箭头和右箭头、加法、减法,但KeyUp/Down事件都将按下的键视为值为229的ProcessCommandKey。IME似乎拥有对输入的所有控制权。我没有从KeyEventArgs中看到任何进一步的数据

当IME处于活动状态时,如何从事件中检查键的实际值(左、右等)


谢谢。

当你在寻找替代品(如果我很好地理解)KEYUP或KEYDOWN事件处理程序时,这可能是一种考虑的方式。实际上,您可以扩展
TextBox
类,然后重写
WndProc
方法。 您可以监听WM_KEYUP消息,然后获取用于识别所按下键的参数。下面的代码显示了一个基础,用户可以从该基础开始改进它:

   Private Class MyTextBox
        Inherits TextBox

        Dim H As String = "&H"
        Private WM_KEYUP As Integer = CInt(H & "0x101")

        Private VK_RIGHT As Integer = CInt(H & "0x27")
        Private VK_LEFT As Integer = CInt(H & "0x25")
        Private VK_ADD As Integer = CInt(H & "0x6B")
        Private VK_SUBTRACT As Integer = CInt(H & "0x6D")

        Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

            If m.Msg.Equals(WM_KEYUP) Then
                Select Case m.WParam.ToInt32
                    Case VK_RIGHT
                        Debug.WriteLine("RIGHT ARROW pressed")

                    Case VK_LEFT
                        Debug.WriteLine("LEFT ARROW pressed")

                    Case VK_ADD
                        Debug.WriteLine("+ pressed")

                    Case VK_SUBTRACT
                        Debug.WriteLine("- pressed")

                End Select
            End If
            MyBase.WndProc(m)
        End Sub

    End Class

我找到了一个非常另类的解决方案,我猜它可能不适用于所有系统,但我所做的是检查KeyUp事件中的System.Char值

方向键似乎被视为“标点符号”,因此System.Char.ispuncuation返回true

    Dim c As Char = ChrW(e.KeyCode)

    Select Case True
        Case System.Char.IsPunctuation(c)
            Select Case e.KeyCode
                  Case Keys.Left
                       'Code here
            End select
    End Select
注意:这仅在文本框处于IME模式时发生

(功能键也返回p-z的值)