首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Visual C# 2005 控件按鍵捕獲實戰(二):ProcessCmdKey 重寫與 DataGridView 完整範例

     編輯:關於C語言

核心技術:重寫 ProcessCmdKey

若需不論控件狀態 (焦點、編輯模式等) 皆能捕獲按鍵,必須繼承目標控件並重寫 ProcessCmdKey。

方法簽章

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
  • msg:視窗訊息 (如 WM_KEYDOWN=0x100、WM_SYSKEYDOWN=0x104),傳址呼叫
  • keyData:按鍵代碼 (含修飾鍵 Ctrl/Alt/Shift),型別 Keys 列舉

DataGridView 完整範例

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 按鍵捕獲示意

視窗標題列即時顯示捕獲的方向鍵,證明無論 DataGridView 處於何種狀態,按鍵皆被成功攔截。

適用範圍

同樣方法可套用至任何 Windows Forms 控件:TextBox、ListView、TreeView、自訂控件等。

設計要點

  • 務必呼叫 base.ProcessCmdKey 保留原本導航功能
  • 檢查 msg.Msg 區分一般按鍵與系統按鍵 (含 Alt)
  • keyData 已包含修飾鍵資訊,可直接比對 Keys.Control | Keys.Enter 等組合
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved