WPF: как обнаружить повторение ключа в ключевых* событиях?
Примечание: e.IsRepeat
подтверждено, что работает. Проблема существует, потому что я использую удаленный рабочий стол от Ubuntu до Windows.
я нашел обходной путь для этой проблемы с удаленным рабочим столом:
- отключить повторение клавиш в Ubuntu.
- в окнах хоста: включить FilterKeys с "Включить повторяющиеся клавиши и медленные клавиши"
- С помощью regedit перейдите в
HKEY_CURRENT_USERControl PanelAccessibilityKeyboard Response
- Set
AutoRepeatDelay
,AutoRepeatRate
, иLast Valid Delay
,Last Valid Repeat
для достаточно малых. - отключить FilterKeys и повторно включить, чтобы обновить изменения реестра.
- Set
как обнаружить повторение ключа в KeyUp
/KeyDown
(или PreviewKeyDown
/PreviewKeyUp
) событий?
у меня есть такой тест:
public Window1() {
InitializeComponent();
this.KeyDown += new KeyEventHandler(Window1_KeyDown);
this.KeyUp += new KeyEventHandler(Window1_KeyUp);
}
void Window1_KeyUp(object sender, KeyEventArgs e) {
if (e.Key == Key.D) {
Console.WriteLine("DOWN: key: {0}, rep{1}, togg{2}, dow{3}, up{4}", e.Key, e.IsRepeat, e.IsToggled, e.IsDown, e.IsUp);
}
}
void Window1_KeyDown(object sender, KeyEventArgs e) {
if (e.Key == Key.D) {
Console.WriteLine("UP: key: {0}, rep{1}, togg{2}, dow{3}, up{4}", e.Key, e.IsRepeat, e.IsToggled, e.IsDown, e.IsUp);
}
}
это дает мне вывод на экран после, если я нажму букву D вниз и отпустите ее после a в то время как:
// Note: Here I press D-key down.
UP: key: D, repFalse, toggTrue, dowTrue, upFalse
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue
UP: key: D, repFalse, toggFalse, dowTrue, upFalse
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue
UP: key: D, repFalse, toggTrue, dowTrue, upFalse
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue
UP: key: D, repFalse, toggFalse, dowTrue, upFalse
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue
UP: key: D, repFalse, toggTrue, dowTrue, upFalse
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue
UP: key: D, repFalse, toggFalse, dowTrue, upFalse
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue
UP: key: D, repFalse, toggTrue, dowTrue, upFalse
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue
UP: key: D, repFalse, toggFalse, dowTrue, upFalse
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue
UP: key: D, repFalse, toggTrue, dowTrue, upFalse
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue
UP: key: D, repFalse, toggFalse, dowTrue, upFalse
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue
UP: key: D, repFalse, toggTrue, dowTrue, upFalse
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue
UP: key: D, repFalse, toggFalse, dowTrue, upFalse
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue
// Note: Here I release D-key.
видимо e.IsRepeat
всегда ложно, так что это бесполезно. Я также заметил, что иногда первое событие также toggFalse, dowTrue, поэтому его нельзя использовать в качестве шаблона.
Я также отмечаю, что умный способ использования времени может быть использован для обнаружения повторения, но должен быть родной способ сделать это.
2 ответов
почему бы не использовать собственные возможности? Я добавил событие PreviewKeyDown в окне и два текстовых поля. Нажмите и удерживайте клавишу во втором текстовом поле, и это вывод:
Repeat: False, key: D
Repeat: True, key: D
Repeat: True, key: D
Repeat: True, key: D
Repeat: True, key: D
Repeat: True, key: D
Repeat: True, key: D
Repeat: True, key: D
Это код, который я использовал:
private void Grid_PreviewKeyDown(object sender, KeyEventArgs e)
{
textBox1.Text += String.Format(
"Repeat: {0}, key: {1}\n",
e.IsRepeat,
e.Key);
}
обновление: удалил весь мой код (был какой-то мусор из других тестов) и вставил в ваш код как есть. Это дает мне следующий вывод в консоли, поэтому я полагаю, что мы должны взглянуть на другие причины...
UP: key: D, repFalse, toggTrue, dowTrue, upFalse
UP: key: D, repTrue, toggTrue, dowTrue, upFalse
UP: key: D, repTrue, toggTrue, dowTrue, upFalse
UP: key: D, repTrue, toggTrue, dowTrue, upFalse
UP: key: D, repTrue, toggTrue, dowTrue, upFalse
UP: key: D, repTrue, toggTrue, dowTrue, upFalse
установите переменную, когда событие keydown запускает отслеживание, какая клавиша нажата, сделайте свою вещь (tm), затем проигнорируйте дальнейшие события для этого ключа. Когда keyup срабатывает очистить переменную. Вам может понадобиться список для отслеживания нескольких ключей.