問題一描述:當新建一個窗體時,添加KeyDown事件后,會正常處理,但是當添加有控件時,比如Button,TextBox,不會觸發窗體的KeyDown事件,也沒有調用KeyDown事件的處理程序。
原因:由於窗體中添加了控件,於是焦點就在其中一個控件上,如果我們要處理的事件窗體和獲取焦點的控件都同時擁有,系統就會將鍵盤的操作鍵值直接傳遞給這個獲取焦點的控件。,就會出現上面這個問題。
解決方案:此時需要將窗體的KeyPreview屬性設置為true,將系統傳入的鍵值先傳遞給窗體,再傳遞給控件。MSDN關於KeyPreview的說明:如果窗體將接收所有鍵事件,則為 true;如果窗體上當前選定控件接收鍵事件,則為 false。默認為 false。更多詳情請參見MSDN:
http://msdn.microsoft.com/zh-cn/library/system.windows.forms.form.keypreview(VS.80).aspx
問題二描述:將keyPreview值設置成true后按功能鍵和數字鍵都沒有問題,但是按方向鍵任然沒有觸發KeyDown事件。
原因:方向鍵是作為系統鍵來處理的,默認方向鍵的作用是移動焦點,系統處理完了就不會將鍵盤的鍵值傳遞個窗體或獲取焦點的控件,也不會觸發窗體的KeyDown事件。 在沒有控件的時候沒有其他的控件可以移動焦點,系統不處理,這才會將鍵值傳遞給窗體,觸發KeyDown事件
解決方案:覆蓋默認的系統鍵處理方式,遇到方向鍵,則直接返回,系統不處理,這樣鍵值就會被傳遞到窗體,觸發KeyDown事件。
覆蓋默認的系統鍵處理方式的代碼:
protected override bool ProcessDialogKey(Keys keyData)
{
switch (keyData)
{
case Keys.Tab: label1.Text ="1";
break;
case Keys.Left: label1.Text ="2";
break;
case Keys.Right: label1.Text ="3";
break;
}
if (keyData == Keys.Up || keyData == Keys.Down ||
keyData == Keys.Left || keyData== Keys.Right)
return false;
else
returnbase.ProcessDialogKey(keyData);
}
轉自:http://blog.csdn.net/genganpeng/article/details/8649191