C#表單無法接受Keydown事件

來源:互聯網
上載者:User

標籤:

問題一描述:當建立一個表單時,添加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事件

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.