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

问题描述

我使用的文本框启用了日语输入法。

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

我希望能够处理非文本键,例如向左和向右箭头、添加、减法,但 KeyUp/Down 事件都将按下的键视为 ProcessCommandKey,其值为 229。它出现IME 拥有对输入的所有控制权。我没有看到来自 KeyEventArgs 的任何其他数据。

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

谢谢。

解决方法

当您正在寻找 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.IsPunctuation 返回 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 的值)