Событие KeyDown запускается в VB.Net, когда ни одна клавиша не нажата - PullRequest
1 голос
/ 20 августа 2011

Я использую VS 2008 и собираю свое приложение на Windows 7. Основная форма / окно имеет обработчик событий KeyDown, как показано ниже:

Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
    MsgBox("control = " + e.Control.ToString + ", shift = " + e.Shift.ToString + ", e.Keycode = " + e.KeyCode.ToString)

Когда я собираю его и запускаю в VS, кажется, он работает нормально. Появляется окно сообщения с состоянием клавиш управления и Shift вместе с кодом клавиши, которую я нажал. Однако, если я беру исполняемый файл и запускаю его на компьютере с XP (оба используют .Net Runtime 3.5), как только открывается основная форма, появляется окно сообщения. По сути, событие «KeyDown» запускается без нажатия каких-либо клавиш. Окно сообщения возвращается с: "control = False, shift = False, e.Keycode = None".

Как это возможно? Как вызвать событие keyDown, если не было нажато ни одной клавиши (что подтверждается выводом, содержащимся в окне сообщения?)

Есть ли какие-либо предложения о том, что может происходить или как я могу диагностировать это в окне XP, поскольку на нем нет Visual Studio?

Обновление Я попытался создать новый проект, в котором есть только «form1», и единственным кодом, стоящим за этим, является обработчик события keyDown. Он просто открывает пустое окно и открывает окно сообщения, если нажата клавиша. Он работал, как и ожидалось, в окне Win 7, но когда я переместил исполняемый файл в окно XP, он сразу же открыл окно сообщения, не нажимая клавишу. Очень странно.

Ответы [ 2 ]

0 голосов
/ 23 августа 2011

Иногда .net контролирует запуск формы или приложения.Microsoft говорит, что это «по замыслу».Если у вас есть проблема, вы можете использовать переменную flag, чтобы прервать любую обработку в обработчике клавиатуры до тех пор, пока форма не будет загружена.

0 голосов
/ 20 августа 2011

Лучший способ сделать это - переопределить ProcesCmdKey для вашей формы, как показано в примере ниже:

   Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, keyData As System.Windows.Forms.Keys) As Boolean
    MessageBox.Show("Pressed" & Convert.ToChar(keyData))
    Return MyBase.ProcessCmdKey(msg, keyData)
End Function

С уважением.

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