如何替换用户控件上的某些按下的键?

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