2010-03-17 59 views
11

我試圖在Windows窗體應用程序中捕獲標籤鍵,並在按下時執行自定義操作。如何攔截WinForms應用程序中的捕獲TAB鍵?

我有幾個列表視圖和按鈕的形式,我已經設置窗體的的KeyPreview屬性爲true,當我按除標籤其他任何鍵,我的KeyDown事件處理程序被調用。

但是這不是標籤鍵 - 即使在WndProc中我也沒有收到WM_KEYDOWN消息。

我是否需要在表單中設置每個控件 - 其TabStop屬性 - 爲false?必須有比這更優雅的方式。

謝謝。

回答

9

this幫助你嗎?

Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean 
    Dim keyPressed As Keys = CType(msg.WParam.ToInt32(), Keys) 

    Select Case keyPressed 
    Case Keys.Right msgbox("Right Arrow Key Caught") 
    Case Keys.Left msgbox("LeftArrow Key Caught") 
    Case Keys.Up msgbox("Up Arrow Key Caught") 
    Case Keys.Down msgbox("Down Arrow Key Caught") 
    Case Else Return MyBase.ProcessCmdKey(msg, keyData) 
    End Select 
End Function 
+0

是的!謝謝。所以爲了完成,我不得不重寫Form的ProcessCmdKey事件並檢查是否(keyData&Keys.Tab)== Keys.Tab。 – Axarydax 2010-03-17 12:01:05

+1

雖然這可能會在理論上回答這個問題,[這將是更可取的](http://meta.stackexchange.com/q/8259)在這裏包括答案的基本部分,並提供參考鏈接。 – 2012-05-22 11:29:06

28

這類似於上面的鏈接中給出的VB代碼的C#代碼...

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     if (keyData == Keys.Tab) 
     { 
      //your code 
     } 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 

希望這有助於...

+0

當然幫了我。爲提供問題所在語言的代碼提供贊成。 – Logarr 2013-02-19 16:18:50

+0

@記者:很高興幫助:-) – Ram 2013-02-25 22:35:52

+0

作爲接受答案pleeease。 – TechNyquist 2014-02-07 09:43:04

5

您可以使用 「PreviewKeyDown」 事件

+0

這就是這麼簡單。謝謝! – nawfal 2012-08-06 11:50:00

-1
Private Sub form1_KeyDown(....) Handles Me.KeyDown 
    If e.KeyCode = Keys.Enter Then 
     SendKeys.Send("{tab}") 
    End If 
End Sub 
+0

確實與這個問題沒有任何關係 - 你攔截Enter鍵然後發送Tab ... – Axarydax 2013-11-28 19:40:29

相關問題