若需不論控件狀態 (焦點、編輯模式等) 皆能捕獲按鍵,必須繼承目標控件並重寫 ProcessCmdKey。
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
msg:視窗訊息 (如 WM_KEYDOWN=0x100、WM_SYSKEYDOWN=0x104),傳址呼叫keyData:按鍵代碼 (含修飾鍵 Ctrl/Alt/Shift),型別 Keys 列舉DataGridView 狀態最複雜 (一般、編輯、選取列/儲存格等),最適合示範此技術。
public partial class MyDataGridView : DataGridView
{
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
const int WM_KEYDOWN = 0x100;
const int WM_SYSKEYDOWN = 0x104;
if (msg.Msg == WM_KEYDOWN || msg.Msg == WM_SYSKEYDOWN)
{
switch (keyData)
{
case Keys.Down: this.Parent.Text = "向下鍵已被捕獲"; break;
case Keys.Up: this.Parent.Text = "向上鍵已被捕獲"; break;
case Keys.Left: this.Parent.Text = "向左鍵已被捕獲"; break;
case Keys.Right: this.Parent.Text = "向右鍵已被捕獲"; break;
case Keys.Home: this.Parent.Text = "Home 鍵已被捕獲"; break;
case Keys.End: this.Parent.Text = "End 鍵已被捕獲"; break;
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
}

視窗標題列即時顯示捕獲的方向鍵,證明無論 DataGridView 處於何種狀態,按鍵皆被成功攔截。
同樣方法可套用至任何 Windows Forms 控件:TextBox、ListView、TreeView、自訂控件等。
base.ProcessCmdKey 保留原本導航功能msg.Msg 區分一般按鍵與系統按鍵 (含 Alt)keyData 已包含修飾鍵資訊,可直接比對 Keys.Control | Keys.Enter 等組合