KeyPreview не перехватывает клавиши стрелок

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Кул Хацкер
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 28.02.2002 (Чт) 23:55
Откуда: Russia

KeyPreview не перехватывает клавиши стрелок

Сообщение Кул Хацкер » 19.12.2005 (Пн) 11:33

Свойство формы KeyPreview не перехватывает клавиши стрелок(курсор). При нажатии на любые другие клавиши все нормально работает, но при нажатии на стрелки не возникают в форме события KeyPress, KeyDown.
Вместо событий, стрелки перемещают фокус по кнопкам формы. Как это отключить?

Gloom
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 200
Зарегистрирован: 23.11.2004 (Вт) 15:57
Откуда: СПб

Сообщение Gloom » 19.12.2005 (Пн) 12:09

KeyDown срабатывает...

Кул Хацкер
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 28.02.2002 (Чт) 23:55
Откуда: Russia

Сообщение Кул Хацкер » 20.12.2005 (Вт) 10:59

Gloom писал(а):KeyDown срабатывает...


У меня стоит VS2005 и в VB .NET KeyDown не срабатывает совершенно точно - клавиши курсора двигают фокус по элементам формы и Enter тоже не вызывает KeyDown, а нажимает элемент с фокусом.
Можно ли вообще откючить фокус в принципе?

Gloom
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 200
Зарегистрирован: 23.11.2004 (Вт) 15:57
Откуда: СПб

Сообщение Gloom » 20.12.2005 (Вт) 13:50

У меня стоит VS2005 и в VB .NET KeyDown не срабатывает совершенно точно

Специально проверил на VS2005 - KeyDown работает пучком...

Кул Хацкер
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 28.02.2002 (Чт) 23:55
Откуда: Russia

Сообщение Кул Хацкер » 21.12.2005 (Ср) 10:40

Gloom писал(а):Специально проверил на VS2005 - KeyDown работает пучком...


Создай новый проект, просто добавь на форму одну кнопку, включи КеуPreview и добавь это
Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
MsgBox(e.KeyCode.ToString)
End Sub
... и ты убедишься что ни Enter ни курсор KeyDown не вызывает, а если ты удалишь кнопку с формы, то все нормально работает (VS2005 v.8.0.50727.42)

Gloom
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 200
Зарегистрирован: 23.11.2004 (Вт) 15:57
Откуда: СПб

Сообщение Gloom » 22.12.2005 (Чт) 11:00

Да действительно, если фокусом обладает кнопка, то нажатия спец. клавиш(помимо "стрелочных", это ещё tab и return) не обрабатываются.
Вылечить можно, если вместо стандартного класса Button, использовать свой (производный от Button), в котором переопределить метод IsInputKey...

Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

Сообщение Maitris » 22.12.2005 (Чт) 13:29

Gloom, лови KeyDown/KeyUp формы при KeyPreview = True, и делай e.Handled = True в процедуре.
----

Gloom
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 200
Зарегистрирован: 23.11.2004 (Вт) 15:57
Откуда: СПб

Сообщение Gloom » 22.12.2005 (Чт) 14:37

Maitris писал(а):Gloom, лови KeyDown/KeyUp формы при KeyPreview = True, и делай e.Handled = True в процедуре.

Советую прочитать топик ещё раз...

Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

Сообщение Maitris » 22.12.2005 (Чт) 19:18

2Gloom ---
И? Человеку нужно обработать нажатие Up/Down/Left/Right самостоятельно и при этом отменить обработку события системой.. Изначально тема об этом.
Так же можно поймать нажатие Enter, например, и вручную вызвать нужный sub не давая фокуса элементу.

Private Sub Form1_KeyUp
Select Case sender.name
Case "Button1"
...
Case "Button2:
...
End Select

e.Handled = True

End Sub
И никакого фокуса :twisted: В общем кому как удобно.
----

Gloom
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 200
Зарегистрирован: 23.11.2004 (Вт) 15:57
Откуда: СПб

Сообщение Gloom » 23.12.2005 (Пт) 13:54

Maitris писал(а):2Gloom ---
И? Человеку нужно обработать нажатие Up/Down/Left/Right самостоятельно и при этом отменить обработку события системой.. Изначально тема об этом.
Так же можно поймать нажатие Enter, например, и вручную вызвать нужный sub не давая фокуса элементу.

Private Sub Form1_KeyUp
Select Case sender.name
Case "Button1"
...
Case "Button2:
...
End Select

e.Handled = True

End Sub
И никакого фокуса :twisted: В общем кому как удобно.


ИМХО, ты нифига не понял.
Допустим у тебя на форме кнопка и текстбокс.
Если кнопка обладает фокусом, то при нажатии "стрелочных" клавиш событие KeyDown вообще не наступает - вместо этого фокус перемещается в текстбокс и событие KeyUp наступает уже в нём.
Насколько я понял, человек хочет этого избежать.

Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

Сообщение Maitris » 23.12.2005 (Пт) 17:17

Ну если кнопка уже изначально не получит фокуса, то соответственно и нет необходимости в этом..
Ведь ему же не нужно обработать конкретно Button1_KeyDown, верно? Только общий KeyDown ФОРМЫ в любой момент, eg. как shortcuts меню..
----


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

    TopList  
cron