2013-07-24 103 views
0

我有一個表單,創建一個類。該類處理在表單上觸發的事件。問題是我試圖使用KeyDown事件,但它不工作,因爲表單上有按鈕,它們捕獲KeyDown。我發現另一篇文章的解決方案是重寫ProcessCmdKey。問題是我不知道如何重寫另一個類中的方法。任何人都可以告訴我如何從其他課程中捕獲所有KeyDown事件?從另一個類C#覆蓋KeyDown#

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    if (keyData == Keys.Left) 
    { 
     MoveLeft(); DrawGame(); DoWhatever(); 
     return true; //for the active control to see the keypress, return false 
    } 
    else if (keyData == Keys.Right) 
    { 
     MoveRight(); DrawGame(); DoWhatever(); 
     return true; //for the active control to see the keypress, return false 
    } 
    else if (keyData == Keys.Up) 
    { 
     MoveUp(); DrawGame(); DoWhatever(); 
     return true; //for the active control to see the keypress, return false 
    } 
    else if (keyData == Keys.Down) 
    { 
     MoveDown(); DrawGame(); DoWhatever(); 
     return true; //for the active control to see the keypress, return false 
    } 
    else 
     return base.ProcessCmdKey(ref msg, keyData); 
} 
+0

你意識到「從另一個班級覆蓋......」沒有任何意義,對嗎? –

回答

0

這樣做會暴露從ButtonKeyDown包含窗體上的最簡單方法。

class MyForm : Form { 
    Button m_button; 

    public event KeyEventHandler ButtonKeyDown; 

    public MyForm() { 
    m_button = ...; 
    m_button.KeyDown += delegate (object, e) { 
     KeyEventHandler saved = ButtonKeyDown; 
     if (saved != null) { 
     saved(object, e); 
     } 
    }; 
    } 
} 

現在調用代碼可以簡單的勾入MyForm::ButtonKeyDown事件

+0

這不起作用,因爲我的表單上不只有一個按鈕。 – Synaps3

+0

@ Synaps3爲什麼不通過相同的事件代理所有的按鈕? – JaredPar

0

我不知道你是如何佈線了你的類的事件,但如果你設置窗體的KeyPreview屬性誠然,您可以在那裏抓住事件,然後將其傳遞給正在處理事件的班級。因此,即使按鈕具有焦點,KeyDown也會在表單上觸發事件。

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    ... Invoke your class 
} 
+0

設置KeyPreview屬性確實有效。唯一的問題是某些鍵仍然不會觸發(箭頭鍵,選項卡)。我怎樣才能爲所有鍵做這項工作? – Synaps3

+0

我真的仍然需要幫助檢測箭頭鍵,選項卡。 – Synaps3

+0

看看[鏈接](http://stackoverflow.com/questions/1646998/up-down-left-and-right-arrow-keys-do-not-trigger-keydown-event)他們有一個解決方案的箭頭鍵。 –