Предотвращение фокус-способных элементов управления от кражи ввода с клавиатуры - PullRequest
1 голос
/ 24 ноября 2011

В настоящее время я работаю над простой игрой, которая рисуется на форме путем переопределения метода OnPaint.Игра требовала ввода с клавиатуры и работала отлично, пока я не решил улучшить графический интерфейс и добавить несколько кнопок в форму.

В момент добавления этих кнопок форма перестала получать любой ввод с клавиатуры, как бы трудноЯ старался, чтобы фокус всегда был на кнопках.Это поведение может быть воспроизведено путем размещения любого Фокусируемого элемента управления в форме.(т.е. TextBox)

Мне не нужно ЛЮБОЕ взаимодействие с Kayboard с этими кнопками, я хочу, чтобы пользователь взаимодействовал с ними только с помощью мыши.

I 'Мы попробовали следующие методы, чтобы попытаться обойти эту проблему - ни один из них не работал:

  • 1) Обычные KeyDown и KeyUp события формы.(Так я записывал ввод с клавиатуры перед размещением кнопок.)
  • 2) Переопределение форм OnKeyDown и OnKeyUp событий.
  • 3) Переопределение ProcessCmdKey - Работает , но не может различить события KeyUp и KeyDown, поэтому мне это не подходит.

Я также пытался создать MessageFilter для приложения, но не смог заставить егозахватывайте только те клавиши клавиатуры, которые мне были нужны.

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

Ответы [ 2 ]

5 голосов
/ 24 ноября 2011

Вот пример формы с IMessageFilter для клавиш со стрелками вверх и вниз, надеюсь, это поможет:

public partial class MainForm : Form
{
    private class MessageFilter : IMessageFilter
    {
        public MainForm Main { get; set; }
        public bool PreFilterMessage(ref Message msg)
        {
            const int WM_KEYDOWN = 0x100;
            const int WM_KEYUP = 0x101;
            if (msg.Msg == WM_KEYDOWN)
            {
                var keyData = (Keys)msg.WParam;
                if (keyData == Keys.Down || keyData == Keys.Up)
                {
                    return true; // Process keys before return
                }
            }
            else if (msg.Msg == WM_KEYUP)
            {
                var keyData = (Keys)msg.WParam;
                if (keyData == Keys.Down || keyData == Keys.Up)
                {
                    return true; // Process keys before return
                }
            }
            return false;
        }
    }
    public MainForm()
    {
        this.InitializeComponent();
        Application.AddMessageFilter(new MessageFilter { Main = this });
    }
}

Для просмотра списка возможных сообщений Windows проверьте:

Список сообщений Windows

2 голосов
/ 24 ноября 2011

Установите для свойства KeyPreview формы значение True, а затем установите event.Handled = True при обработке KeyDown / KeyUp.Это гарантирует, что форма получит возможность обрабатывать события до своих дочерних элементов.Поскольку для свойства handled установлено значение true, ребенок не будет видеть события клавиатуры.

Дополнительная информация здесь: http://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...