C#窗體無法接受Keydown事件


問題一描述:當新建一個窗體時,添加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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM