Как я могу заменить некоторую нажатую клавишу на пользовательском элементе управления?

Я хочу, чтобы клавиша пробела делала именно то, что делает Tab в моем UserControl. Я переопределил свою функцию управления 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

1 ответ

Решение

Я сделал это, заменив 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
Другие вопросы по тегам