標籤:
問題一描述:當建立一個表單時,添加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);
}
C#表單無法接受Keydown事件