好吧,我做了一些研究,有效,對方向鍵key_down的事件被處理之前被捕獲...
這裏是它啓動源: http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Control.cs,7765d3efe64d5539
它是如何工作
當按下一個鍵,這裏是控制內部發生了什麼列表:
功能PreProcessControlMessageInternal
被調用。
此函數將引發控件上的事件PreviewKeyDown。 然後它會打電話PreProcessMessage
。
函數PreProcessMessage
被調用。
該函數實際上檢查是否有人想使用已按下的鍵。在我們的例子中,(WM_KEYDOWN):
控制首先調用ProcessCmdKey
:如果有人想決定,這是一個命令鍵,返回True並使用該密鑰。沒有其他人會看到該鍵已關閉
然後控制調用IsInputKey()
:如果有人決定這是一個輸入鍵(例如TextBoxes),則返回True並處理您的鍵。
然後調用ProcessDialogKey()
:Litterally從ReferenceSource]
被稱爲檢查對話框鍵,如TAB,箭頭鍵和助記
怎麼辦
就你而言,你有三種可能性,最後是最好的(a第二最容易):
過程時ProcessDialogKey()
接收它的信息:
Protected Overrides Function ProcessDialogKey(keyData As Keys) As Boolean
If keyData = Keys.Up Or keyData = Keys.Down Or keyData = Keys.Left Or keyData = Keys.Right Then
'Do whatever you want with the key
Return True 'So the processing will stop
End If
Return MyBase.ProcessDialogKey(keyData)
End Function
防止該鍵可以在Button_keyDown()
Protected Overrides Function ProcessDialogKey(keyData As Keys) As Boolean
If keyData = Keys.Up Or keyData = Keys.Down Or keyData = Keys.Left Or keyData = Keys.Right Then
Return False
End If
Return MyBase.ProcessDialogKey(keyData)
End Function
Private Sub btn_OK_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles btn_OK.KeyDown
If e.KeyCode = Keys.Up Then
If mode = mymodes.first Then
firstcontrol.Focus()
Else
secondcontrol.Focus()
End If
End If
End Sub
最佳處理它的處理方式
所以實際上(基於瑣佩萊德的評論),最好的辦法是處理PreviewKeyDown事件,所以你不必重寫任何其他方法:
Private Sub Form1_PreviewKeyDown(sender As Object, e As PreviewKeyDownEventArgs) Handles MyBase.PreviewKeyDown
'Do whatever here, all the keydown events will fall into this sub.
End Sub
請使用唯一的相關標籤。我已經刪除了C#標記,因爲您的代碼是vb.net。 –
我會接受C#中的答案代碼。 – user1697111
那麼在這種情況下,你應該在你的問題的文本中指定。否則就好像你在添加不相關的標籤。 –