【问题标题】:Processing Key events in a Textbox using Japanese IME VB.net使用日语 IME VB.net 处理文本框中的键事件
【发布时间】:2021-08-21 07:32:29
【问题描述】:

我正在使用一个为日语启用了 IME 的文本框。

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

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

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

谢谢。

【问题讨论】:

    标签: vb.net ime


    【解决方案1】:

    当您正在寻找 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
    

    【讨论】:

      【解决方案2】:

      我找到了一个相当另类的解决方案,我猜它可能不适用于所有系统,但我所做的是检查 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 的值)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-27
        • 2012-12-18
        • 1970-01-01
        • 2010-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多