Кнопка запрещает запуск события KeyDown даже с помощью keypreview = true

Шаги по воспроизведению в VS Express 12:

  • Создайте новый проект приложения Windows Forms
  • Добавить кнопку
  • Установите форму KeyPreview в true
  • Добавить событие keyDown в форму
  • Событие не будет срабатывать, пока кнопка присутствует в форме

У меня есть проект, в котором я хочу поймать как keydown, так и события keyup, однако я могу только заставить запустить событие keyup.

У меня есть форма с одной панелью, кнопкой и надписью на ней. В форме свойство keyPreview имеет значение true и связано как с событиями KeyDown, так и с KeyUp. Однако, когда я запускаю программу, запускается только событие KeyUp.

Я попытался добавить обработчики событий вручную, добавив

this.KeyPreview = true; this.KeyDown += new KeyEventHandler(Form1_KeyDown); 

Но это все еще не работает.

Какие-либо предложения?

Событие KeyUp:

  private void Form1_KeyUp(object sender, KeyEventArgs e) { TriggerKey(e.KeyCode, false); } private void TriggerKey(Keys e, Boolean pKeyDown) { switch (e) { case Keys.Left: mLeft = pKeyDown; break; case Keys.Right: mRight = pKeyDown; break; case Keys.Down: mDown = pKeyDown; break; case Keys.Up: mUp = pKeyDown; break; } } 

Событие Form1_KeyDown выглядит следующим образом:

 private void Form1_KeyDown(object sender, KeyEventArgs e) { TriggerKey(e.KeyCode, true); } 

Edit2: Я попытался удалить кнопку из моей формы, и тогда оба события запускаются правильно. Если я добавлю его обратно, событие keyDown перестанет работать снова. Почему кнопка влияет на свойство keypreview?

KeyPreview – это функция совместимости с VB6, это не «родные» Winforms. И это проблема, которая точно соответствует вашей проблеме. Есть другие методы формы, которые сначала обнюхивают нажатие клавиши, прежде чем код, который смотрит на KeyPreview, получит шанс запустить и запустить событие KeyDown. И сначала они едят навигационные нажатия клавиш. Подобно клавишам курсора, которые вы пытаетесь увидеть, а также клавише Tab. Это соответствует поведению VB6, он также не может видеть клавиши курсора.

Чтобы оставаться впереди этого кода, вам нужно переопределить метод ProcessDialogKey () формы. Как это:

  protected override bool ProcessDialogKey(Keys keyData) { switch (keyData) { case Keys.Left: //... return true; } return base.ProcessDialogKey(keyData); } 

вы устанавливаете mUp на keyDown …? можете ли вы добавить весь связанный контекст кода, такой как событие mouse up, также вы можете попытаться обновить, если вы сломаете, даже огонь по клавише вниз?

Обратите внимание, что при нажатии клавиши keyup (если вы хотите, чтобы ваш mUp оставался истинным)

Я видел в других подобных сообщениях, что это могло бы помочь

 this.focus(); 

попробуйте и дайте мне знать, чтобы продолжать искать другие способы