2014-02-24 4 views
0

Я хочу установить фокус на конкретный textbox, когда я нажимаю ALT + KOME.VB.net TextBox не будет сфокусирован() с событием Keydown

Однако, когда я нажимаю комбинацию клавиш быстрого доступа, он фокусирует что-то еще. Даже я нажал CTRL + P, txtAuthor не получил никакого фокуса, пока какой-то странный Button control или другой textbox получил фокус.

Я проверил, что нет дублированных комбинаций клавиш. например: & Нажмите здесь ..

plus: подтверждается отладкой, что при нажатии Alt + Q, например, выполняется код txtQueue.Focus(). Но, как-то txtQueue не будет сфокусирован.

плюс: KeyPreview установлен в True

Private Sub frmEdit_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown 


    'Alt+Q 
    If e.KeyCode = Keys.Q AndAlso e.Modifiers = Keys.Alt Then 
     txtQueue.Focus() 
     Exit Sub 
    End If 

    'Alt+D 
    If e.KeyCode = Keys.D AndAlso e.Modifiers = Keys.Alt Then 
     txtDynamic.Focus() 
     Exit Sub 
    End If 

    'Alt+K 
    If e.KeyCode = Keys.K AndAlso e.Modifiers = Keys.Alt Then 
     txtTime.Focus() 
     Exit Sub 
    End If 

    'Alt+P 
    If e.KeyCode = Keys.P AndAlso e.Modifiers = Keys.Alt Then 
     txtAlgorithm.Focus() 
     Exit Sub 
    End If 


End Sub 

спасибо!

+1

код неправильно, он забывает установить е .Handled = True. Таким образом, все возможно, после этого может выполняться другая мнемоника или ярлык и беспорядок вверх. –

+0

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

+0

@HansPassant на самом деле я удалил e.Handled = True, потому что это не исправить проблему. Я добавил этот код снова, но ничего не изменилось. – klados

ответ

0

перекрывая ProcessCmdKey() работает!

Я не знаю причину, однако, периодически ProcessCmdKey() не работает, даже если я нажал форму, кнопки внутри формы и т.д. ...

0

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

Также я хотел бы изменить код, чтобы включить отборный случай ...

Private Sub frmEdit_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown 

If e.Modifiers = Key.Alt Then 

    Select Case (e.KeyCode) 

     'Alt+Q 
     Case Keys.Q 
      txtQueue.Focus() 
      Exit Select 

     'Alt+D 
     Case Keys.D 
      txtDynamic.Focus() 
      Exit Select 

     'Alt+K 
     Case Keys.K 
      txtTime.Focus() 
      Exit Select 

     'Alt+P 
     Case Keys.P 
      txtAlgorithm.Focus() 
      Exit Select 
    End Select 

End If 

End Sub 
+1

Вы не решаете проблему: рекомендации по отладке кода не представляют собой решение; и замена исходного кода на Select Case, безусловно, не исправит никаких проблем. Все это звучит скорее как комментарий, чем как ответ на меня. – varocarbas

+0

В некотором смысле я бы согласился .. но он может указать, что где-то еще в коде фокус меняется и, следовательно, на решение. Изменение в Select Case лучше показано в ответе, где код может отображаться в блоке. Но точка взята. – Mych

+0

Странно, что когда я нажимаю ALT + D, он правильно фокусирует «txtDynamic», а когда я нажимаю ALT + Q, он фокусирует несколько неожиданных «кнопок управления» (всегда одна и та же кнопка, когда я нажимаю ALT + Q). Есть ли какая-либо ** скрытая ** короткая клавиша конфигурирования? – klados

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