Стрелка ключевых событий не прибывает - PullRequest
6 голосов
/ 21 июля 2010

По сути, у меня есть форма с пользовательским элементом управления (и ничего больше).Пользовательский элемент управления полностью пуст, и для формы KeyPreview установлено значение true.

При этой настройке я не получаю никаких событий KeyDown для каких-либо клавиш со стрелками или вкладки.Все остальные клавиши на моей клавиатуре работают.У меня есть обработчики событий KeyDown, подключенные ко всему, что имеет такие события, поэтому я уверен, что ничего не пропущу.

Также следует отметить, что если я удаляю (полностью пустой) пользовательский элемент управления, я ДЕЛАЮполучить события клавиш со стрелками.

Что здесь происходит?

РЕДАКТИРОВАТЬ:

Я добавил это и в форму, и в элемент управления, но я ЕЩЕне получить клавиши со стрелками:

protected override void WndProc(ref Message m) {
    switch (m.Msg) {
        case 0x100: //WM_KEYDOWN
            //this is the control's version. In the form, it's this.Text
            ParentForm.Text = ((Keys)m.WParam).ToString();
            break;
    }
    base.WndProc(ref m);
}

Я также проверил с помощью Spy ++ и определил, что сама форма не получает никаких сообщений WM_KEYDOWN, они все идут в элемент управления.Однако, тем не менее, элемент управления получает сообщения со стрелкой WM_KEYDOWN.Вздох.

Редактировать 2: Я также обновил ZIP-файл с этой версией.Пожалуйста, посмотрите на это, если вы хотите помочь ...

Редактировать 3:

Я понял это, вроде.Форма съедает клавиши со стрелками, вероятно, в попытке сохранить фокус среди своих детей.Это подтверждается тем фактом, что я получаю события, если форма пуста.

В любом случае, если я добавлю этот код в форму, я снова начну получать события:

public override bool PreProcessMessage(ref Message msg) {
    switch (msg.Msg) {
        case 0x100: //WM_KEYDOWN
            return false;
    }
    return base.PreProcessMessage(ref msg);
}

Когда я переопределяю это, форма не получает возможности выполнить свою грязную работу, и поэтому я получаю события KeyDown, как и ожидалось.Я предполагаю, что побочным эффектом этого является то, что я больше не могу использовать свою клавиатуру для навигации по форме (в данном случае это не имеет большого значения, так как это игра, и вся цель этого упражнения - реализовать навигацию с помощью клавиатуры!)

До сих пор остается вопрос о том, как отключить это "правильно", если есть способ ...

Ответы [ 2 ]

10 голосов
/ 21 июля 2010

Я провел обширное тестирование и все понял. Я написал сообщение в блоге, подробно описывающее решение.

Короче говоря, вы хотите переопределить метод ProcessDialogKey в виде:

protected override bool ProcessDialogKey(Keys keyData) {
    return false;
}

Это вызовет клавиши со стрелками(и вкладка) для доставки как обычные события KeyDown.ТЕМ НЕ МЕНИЕ!Это также приведет к сбою нормальной функциональности клавиш диалога (использование Tab для навигации по элементам управления и т. Д.).Если вы хотите сохранить это, но при этом получить событие KeyDown, используйте это вместо этого:

protected override bool ProcessDialogKey(Keys keyData) {
    OnKeyDown(new KeyEventArgs(keyData));
    return base.ProcessDialogKey(keyData);
}

Это доставит сообщение KeyDown, в то же время выполняя обычную диалоговую навигацию.

0 голосов
/ 21 июля 2010

Если фокус является вашей проблемой, и вы не можете заставить свой пользовательский элемент управления сфокусироваться и сохранить его, простое решение для обходного пути состояло бы в том, чтобы перенести событие в ваш пользовательский элемент управления на ключевое событие, которое вас беспокоит , Подпишитесь на события нажатия клавиш или нажатия клавиш, а затем отправьте это событие вашему пользовательскому элементу управления.

По сути, Form1_KeyPress будет вызывать UserControl1_KeyPress с аргументами отправителя и события из Form1_KeyPress, например,

protected void Form1_KeyPress(object sender, KeyEventArgs e)
{
    UserControl1_KeyPress(sender, e);
}

В противном случае вам может потребоваться пройти длинный маршрут и переопределить события WndProc, чтобы получить желаемую функциональность.

...