ПРИМЕЧАНИЕ : e.IsRepeat
подтверждено для работы. Проблема существует, потому что я использую Удаленный рабочий стол из Ubuntu в Windows.
Я нашел решение этой проблемы удаленного рабочего стола:
- Отключить повторение ключей в Ubuntu.
- В хосте Windows: включите FilterKeys с помощью «Включить повторяющиеся и медленные ключи»
- Используя regedit, перейти к
HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response
- Установите
AutoRepeatDelay
, AutoRepeatRate
, и Last Valid Delay
, Last Valid Repeat
на достаточно малые значения.
- Отключите FilterKeys и снова включите, чтобы обновить изменения в реестре.
Как обнаружить повторение ключа в событиях 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 и отпускаю ее через некоторое время:
// 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, поэтому его нельзя использовать в качестве шаблона.
Я также отмечаю, что для обнаружения повторения можно использовать умный способ использования синхронизации, но для этого должен быть собственный способ.