0

我想要空间键做什么标签在我的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 
相关问题