如何解决使用日语 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 的值)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。