2013-07-24 3 views
0

У меня есть форма, которая создает класс. Этот класс обрабатывает события, которые запускаются в форме. Проблема в том, что я пытаюсь использовать событие KeyDown, но он не работает, потому что есть кнопки в форме и они захватывают KeyDown. Я нашел решение на другом посту, чтобы переопределить ProcessCmdKey. Проблема в том, что я не знаю, как переопределить метод из другого класса. Может ли кто-нибудь сказать мне, как я могу захватить все события KeyDown из моего другого класса?Переопределить KeyDown из другого класса C#

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

Самый простой способ сделать это было бы подвергать KeyDown от Button на содержащей форму.

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) у них есть решение для клавиш со стрелками , –

Смежные вопросы