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 
相關問題