WPF: Как обнаружить повторение ключа в событиях Key *? - PullRequest
7 голосов
/ 04 декабря 2009

ПРИМЕЧАНИЕ : e.IsRepeat подтверждено для работы. Проблема существует, потому что я использую Удаленный рабочий стол из Ubuntu в Windows.

Я нашел решение этой проблемы удаленного рабочего стола:

  1. Отключить повторение ключей в Ubuntu.
  2. В хосте Windows: включите FilterKeys с помощью «Включить повторяющиеся и медленные ключи»
  3. Используя regedit, перейти к HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response
    1. Установите AutoRepeatDelay, AutoRepeatRate, и Last Valid Delay, Last Valid Repeat на достаточно малые значения.
    2. Отключите 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, поэтому его нельзя использовать в качестве шаблона.

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

Ответы [ 2 ]

8 голосов
/ 04 декабря 2009

Почему бы не использовать нативные возможности? Я добавил событие 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
0 голосов
/ 04 декабря 2009

Установите переменную, когда событие нажатия клавиши запускает отслеживание нажатой клавиши, сделайте свое дело (tm), затем проигнорируйте дальнейшие события для этой клавиши. Когда срабатывает keyup, очистите переменную. Вам может понадобиться список для отслеживания нескольких клавиш.

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