2011-09-23 29 views
5

我試過使用KeyUp和KeyDown事件來讀取鍵盤輸入,但只要我將其他控件放在Winform上,鍵就不會被讀取。我如何確保密鑰被讀取?如何閱讀Winform上的鍵盤輸入?

+0

你的意思是它爲空白表單,而不是工作是否有控制? – Yuan

+0

是的,正如在下面的答案中所寫的,它適用於按鈕,文本框等控件,但是當我放置用戶控件時,它停止工作。 – Bildsoe

+0

它不應該工作,鍵盤輸入轉到焦點控制。你真的*試圖做什麼? –

回答

4

您可以在窗體上設置KeyPreview = true來捕捉鍵盤事件。

EDITED,讓你明白:

接收鍵盤事件
private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.A) 
     e.SuppressKeyPress = true; 
} 

愚蠢的樣品,如果被壓的下降。
如果焦點位於文本框中,您會看到文字被寫入,但不是A!

再次編輯:我從VB.NET示例中獲取了此代碼。
在您的用戶控件中,使用文本框的「按鍵」事件來引發「用戶控件事件」。
該代碼將是您的自定義用戶控件:

'Declare the event 
Event KeyPress(KeyAscii As Integer) 

Private Sub Text1_KeyPress(KeyAscii As Integer) 
    RaiseEvent KeyPress(KeyAscii) 
End Sub 
+0

這沒有奏效,我仍然沒有註冊任何輸入。 – Bildsoe

+0

@Bildsoe:我試過了,它工作。你應該在表單上捕獲「KeyDown」和「KeyUp」事件:你一定會得到它們。如果不是請發佈你的代碼,因爲應該有什麼問題...... – Marco

+0

好的謝謝,我會盡力,我一定做錯了什麼。我的表單上有一個用戶控件,這是否會改變任何內容? – Bildsoe

2

正如marco所說,在您的表單上將KeyPreview設置爲true,以捕捉整個表單中的關鍵事件而不僅僅是一個控件。

使用KeyPress事件... KeyUp/Down比您的代碼更適合框架。 KeyDown是很好的,如果你想禁用一個鍵...僅數字字段等。一般KeyPress是你所追求的。

如果您想阻止傳播到其他控件的按鍵設置KeyPressEventArgs.Handled = true。

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress(v=VS.90).aspx

你有一臺連接事件處理程序?

MyForm.KeyDown += MyHandler; 

您也可以在屬性做到這一點窗格中...點擊活動圖標...

+0

我需要上下。我想要顯示被按下的鍵,所以keyUp和keyDown都需要發生。 – Bildsoe

+0

啊我明白了...... KeyUp/Down應該和當時一樣。你有線事件處理程序?在事件部分的屬性窗格中還是在代碼中? MyForm.KeyDown + = MyEventHandler; – iDevForFun

+0

是的,我已經連接了事件處理程序。它的工作原理,但不是如果我把一個用戶控件放在窗體上,那麼它停止工作。 – Bildsoe

0

如果您正在尋找你的窗體本身讀取鍵盤輸入,你已經從你的答案其他記者。我正在添加此貢獻,因爲您可能想要將密鑰處理添加到表單上的其他控件或用戶控件。我在DevX.com發佈的文章Exploring Secrets of .NET Keystroke Handling(唉,它確實需要註冊,但它是免費的)爲您提供了全面討論如何以及爲什麼所有各種keyhandling掛鉤和事件發揮作用。此外,該文章還包含一個免費下載的「Keystroke Sandbox」實用程序,實際上可讓您查看哪些控件正在接收哪些密鑰處理事件。

以下是文章一個說明中磨你的胃口:

enter image description here