如何替换用户控件上的某些按下的键?
How can I replace some pressed key on a user-control?
我希望 Space 键的作用与 Tab 在我的用户控件中的作用完全相同。
我已经重写了我的控件 ProccessCmdKey() 函数来实现这一点,但它似乎不起作用:
Public Class ucPelakNum
Inherits TextBox
Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean
Select Case keyData And Not Keys.Shift And Not Keys.Control And Not Keys.Alt
Case Keys.D0 To Keys.D9, Keys.Back, Keys.Delete, Keys.Left To Keys.Down, Keys.Home, Keys.End, Keys.Tab
Return MyBase.ProcessCmdKey(msg, keyData)
Case Keys.Space ' Here is where I want to change key but seems changes are not applied to the base method
keyData = (keyData And Not Keys.Space) Or Keys.Tab
Return MyBase.ProcessCmdKey(msg, keyData)
Case Else
Return True
End Select
End Function
Protected Overrides Sub OnTextChanged(e As EventArgs)
MyBase.OnTextChanged(e)
If Me.TextLength >= Me.MaxLength Then
Me.OnFilled()
End If
End Sub
Public Sub OnFilled()
RaiseEvent Filled()
End Sub
Public Event Filled As Action
End Class
我已经通过替换 msg.wparam
来完成此操作。 重点是 keyData
不是用于将按键信息发送到其他窗体的按键处理器函数的变量,而是 msg.wparam
发送该信息。然后我使用 PreProcessMessage()
方法而不是 ProcessCmdKey()
来替换键,因为它被调用得更早:
Protected Const WM_KEYDOWN As Integer = &H100
Protected Const WM_KEYUP As Integer = &H101
Protected Const WM_CHAR As Integer = &H102
Protected Const WM_SYSKEYDOWN As Integer = &H104
Protected Const WM_SYSKEYUP As Integer = &H105
Public Overrides Function PreProcessMessage(ByRef m As Message) As Boolean
If m.Msg = WM_SYSKEYDOWN OrElse m.Msg = WM_KEYDOWN Then
' Extracting keys data that similar to ProcessCmdKey's keyData parameter.
Dim keyData As Keys = DirectCast(CInt(m.WParam), Keys)
Select Case keyData
Case Keys.Space
m.WParam = CInt(Keys.Tab)
End Select
End If
Return MyBase.PreProcessMessage(m)
End Function
我希望 Space 键的作用与 Tab 在我的用户控件中的作用完全相同。 我已经重写了我的控件 ProccessCmdKey() 函数来实现这一点,但它似乎不起作用:
Public Class ucPelakNum
Inherits TextBox
Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean
Select Case keyData And Not Keys.Shift And Not Keys.Control And Not Keys.Alt
Case Keys.D0 To Keys.D9, Keys.Back, Keys.Delete, Keys.Left To Keys.Down, Keys.Home, Keys.End, Keys.Tab
Return MyBase.ProcessCmdKey(msg, keyData)
Case Keys.Space ' Here is where I want to change key but seems changes are not applied to the base method
keyData = (keyData And Not Keys.Space) Or Keys.Tab
Return MyBase.ProcessCmdKey(msg, keyData)
Case Else
Return True
End Select
End Function
Protected Overrides Sub OnTextChanged(e As EventArgs)
MyBase.OnTextChanged(e)
If Me.TextLength >= Me.MaxLength Then
Me.OnFilled()
End If
End Sub
Public Sub OnFilled()
RaiseEvent Filled()
End Sub
Public Event Filled As Action
End Class
我已经通过替换 msg.wparam
来完成此操作。 重点是 keyData
不是用于将按键信息发送到其他窗体的按键处理器函数的变量,而是 msg.wparam
发送该信息。然后我使用 PreProcessMessage()
方法而不是 ProcessCmdKey()
来替换键,因为它被调用得更早:
Protected Const WM_KEYDOWN As Integer = &H100
Protected Const WM_KEYUP As Integer = &H101
Protected Const WM_CHAR As Integer = &H102
Protected Const WM_SYSKEYDOWN As Integer = &H104
Protected Const WM_SYSKEYUP As Integer = &H105
Public Overrides Function PreProcessMessage(ByRef m As Message) As Boolean
If m.Msg = WM_SYSKEYDOWN OrElse m.Msg = WM_KEYDOWN Then
' Extracting keys data that similar to ProcessCmdKey's keyData parameter.
Dim keyData As Keys = DirectCast(CInt(m.WParam), Keys)
Select Case keyData
Case Keys.Space
m.WParam = CInt(Keys.Tab)
End Select
End If
Return MyBase.PreProcessMessage(m)
End Function