2012-12-05 150 views
10

我有一個帶有幾個控件的窗體。我想在keydown事件上運行一個特定的子節點,而不管任何控件事件。 我的意思是如果用戶在窗體上的任何地方按Ctrl + S它執行子例程。vb.net整個表單上的Keydown事件

回答

17

您應該設置形式爲True上KeyPreview性質和處理存在的keydown事件

當此屬性設置爲true,窗體將接收所有按鍵響應, KeyDown和KEYUP事件。在窗體的事件處理程序完成處理擊鍵後,該擊鍵被分配給 焦點控件。 ..........要僅在表單級別處理鍵盤 事件並且不允許控件接收 鍵盤事件,請將您的 表單的KeyPress事件處理函數中的KeyPressEventArgs.Handled屬性設置爲true。

例如,要處理Control + S組合鍵,您可以爲窗體KeyDown事件編寫此事件處理程序。

Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) Handles MyBase.KeyDown 
    If e.Control AndAlso e.KeyCode = Keys.S then 
     ' Call your sub method here ..... 
     YourSubToCall() 

     ' then prevent the key to reach the current control 
     e.Handled = False 
    End If 
End Sub 
+0

謝謝史蒂夫...非常有幫助 – Malik

1

我在之前的表單中使用過這段代碼,它似乎工作得很好。

Protected Overrides Function ProcessKeyPreview(ByRef m As System.Windows.Forms.Message) As Boolean 
    If m.Msg = &H100 Then 'WM_KEYDOWN 
     Dim key As Keys = m.WParam 
     If key = Keys.S And My.Computer.Keyboard.CtrlKeyDown Then 
      'DO stuff 
      Return True 
     End If 
    End If 

    Return MyBase.ProcessKeyPreview(m) 
End Function