2010-10-01 4 views
0

Мне нужно обработать ввод (среди других ключей) в форме выигрыша без создания звука ошибки, но только если текущий активный элемент управления не обработал его уже.Обработка необработанного ввода ключа C#

Итак, когда ввод нажат в TextBox или DateTimePicker, я хочу обработать его с помощью формы (без звука ошибки), но если она нажата, например, в DataGridView, я хочу, чтобы она обрабатывалась DataGridView по умолчанию.

OnKeyUp решает мою проблему с обработкой только необработанных нажатий клавиш (e.Handled) и ProcessCmdKey (this), решает проблему звука, но ни один из них не решает.

Любые предложения?

ответ

0

Kudos для очень интересного вопроса. К сожалению, я не могу найти глобальный обработчик событий для всех нажатий клавиш, кроме переопределения ProcessCmdKey в основной форме за this article. Только проблема с этим методом заключается в том, что аргументы, переданные в делегат обработчика события, не определяют, какой элемент управления создает событие :(

Итак, я думал, что вам нужно назначить обработчик событий для каждого отдельного элемента управления в Я написал код, который должен помочь вам показать, как это сделать. Я не уверен, что нежелательные последствия могут быть связаны с обработчиком событий KeyPress для каждого элемента управления на вашей странице, но это единственное возможное решение Я вижу

Код:.

private void Form1_Load(object sender, EventArgs e) 
{ 
    AssignHandler(this); 
} 

protected void HandleKeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (e.KeyChar == (char)Keys.Enter && (sender != this.textBoxToIgnore || sender ! this.gridViewToIgnore)) 
    { 
     PlaySound(); // your error sound function 
     e.Handled = true; 
    } 
} 

public void AssignHandler(Control c) 
{ 
    c.KeyPress += new KeyPressEventHandler(HandleKeyPress); 
    foreach (Control child in c.Controls) 
    { 
     AssignHandler(child); 
    } 
} 
+0

параметр Msg для ProcessCmdKey содержит HWND целевого управления (окно) , Вы можете использовать Control.FromHandle для получения управляемого объекта Control. – Tergiver

+0

Я не знал, что обработка KeyPress предотвращает звук ошибки. Я попробовал его с KeyUp и почему-то предположил, что он не будет работать и с KeyPress. Однако, чтобы поймать ключевые события из формы, вам не нужно делать все это, просто установите для свойства KeyPreview формы значение true и обработайте ее ключевые события. – Damir

+0

Кроме того, чтобы избежать явного указания того, какие элементы управления выполняют или не обрабатывают ввод, достаточно добавить &&! E.Handled в выражении if – Damir

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