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