窗體 KeyDown 事件中彈窗無響應,按鍵無任何反應。
窗體默認不處理子控件的鍵盤消息。設置 this.KeyPreview = true 後,窗體會先於焦點控件接收鍵盤事件。
public Form1() {
InitializeComponent();
this.KeyPreview = true; // 關鍵設置
}
檢查設計器生成的代碼 (Form1.Designer.cs) 中是否有:
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown);
或在屬性窗口事件標簽(閃電圖標)中確認 KeyDown 已綁定到 Form1_KeyDown。
KeyPreview=false,窗體收不到按鍵Form1_KeyDown 首行設置斷點或 Console.WriteLine 確認事件是否觸發public partial class Form1 : Form {
public Form1() {
InitializeComponent();
this.KeyPreview = true; // 必須
}
private void Form1_KeyDown(object sender, KeyEventArgs e) {
MessageBox.Show("按鍵: " + e.KeyCode); // 測試用
// 原業務邏輯...
if (listBox1.Items.Contains(e.KeyCode)) {
listBox1.Items.Remove(e.KeyCode);
// 速度調整邏輯...
}
}
}
若需特定控件處理按鍵(如 TextBox 捕獲 Enter),在控件的 KeyDown 中設置 e.Handled = true 阻止冒泡,或重寫 ProcessCmdKey:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
if (keyData == Keys.Enter) { /* 處理 */ return true; }
return base.ProcessCmdKey(ref msg, keyData);
}
Form.KeyPreview = trueKeyDowne.Handledthis.Focus())