Dot-Net

設置 Form.KeyPreview = true 的缺點?

  • March 5, 2010

我想知道 Form.KeyPreview 屬性實際上有什麼用?為什麼它存在,通過將其設置為 true 我會“冒險”什麼?我想它一定有一些負面影響——否則它根本不應該存在(或者至少預設情況下是真的)?

編輯:我非常清楚的作用。我在問為什麼。為什麼我必須將其設置為 true 才能觸發鍵盤事件?為什麼鍵盤事件不總是為表單觸發。什麼不只是標準行為?

我問的特殊原因是:我剛剛在我的應用程序的基本形式中設置了 KeyPreview = true,所有其他形式都繼承自該基本形式。我有什麼令人討厭的驚喜嗎?

Form.KeyPreview 有點不合時宜,繼承自用於表單設計的 Visual Basic 對像模型。回到 VB6 時代,您需要 KeyPreview 才能實現快捷鍵。在 Windows 窗體中不再需要,覆蓋 ProcessCmdKey() 是更好的解決方案:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
 if (keyData == (Keys.Control | Keys.F)) {
   DoSomething();   // Implement the Ctrl+F short-cut keystroke
   return true;     // This keystroke was handled, don't pass to the control with the focus
 }
 return base.ProcessCmdKey(ref msg, keyData);
}

但是支持 KeyPreview 以幫助 VB6 程序員軍團在 2000 年代初切換到 .NET。KeyPreview 或 ProcessCmdKey() 的目的是讓您的 UI 響應快捷鍵。鍵盤消息通常發送到具有焦點的控制項。Windows 窗體消息循環允許程式碼在控制項看到該消息之前先查看它。這對於快捷鍵很重要,為每個可能獲得焦點以檢測它們的控制項實現 KeyDown 事件是非常不切實際的。

將 KeyPreview 設置為 True 不會導致問題。表單的 KeyDown 事件將執行,只有當它具有對擊鍵執行某些操作的程式碼時才會產生影響。但請注意,它緊跟 VB6 用法,您看不到用於導航的擊鍵類型。就像游標鍵和 Tab、Escape 和 Enter 用於對話框一樣。ProcessCmdKey() 沒有問題。

引用自:https://stackoverflow.com/questions/2386695