Как я могу заменить некоторую нажатую клавишу на пользовательском элементе управления?
Я хочу, чтобы клавиша пробела делала именно то, что делает 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