@Grande

Как приостановить туннелирование события в WPF?

Добрый день. В WPF проекте возникла необходимость работать со сканером штрихкодов, но проблема в том что сканер работает через разрыв клавиатуры. Сами понимаете что отличить ввод со сканера от ввода пользователя проблемно. Я пытаюсь решить эту проблему так:
1) На событие окна PreviewTextInput вешаю обработчик (сканировать нужно вне зависимости какой элемент находится в фокусе)
2) После ввода символа смотрим запущен ли таймер (Stopwatch), если нет запоминаем символ и запускаем, если да - останавливаем. Смотрим какой интервал получился (если меньше 20мс, то добавляем символ в буфер, и запускаем таймер по новой а свойство Handled объекта TextCompositionEventArgs выставляем в true). Таким образом таймер будет служить индикатором того что система ожидает ввод следующего символа.
Возникает проблема - первый введенный символ (до начала отсчета таймера) как его считать? Была идея, выжидать 20 мс и если таймер до сих пор работает останавливать его и считать символ введенным с клавиатуры ну и выводить его на экран. Вопрос в том - как приостановить дальнейшее выполнение события, чтобы выждать этот интервал? запуск второго таймера (который DispatcherTimer) не помогает, так как он судя по всему запускается отдельным потоком.
  • Вопрос задан
  • 2440 просмотров
Решения вопроса 1
@Sumor
В вашем случае лучше использовать сканер в режиме работы com-порта.
Либо изменить логику программы так, чтобы сканер просто заменял клавиатуру, как это и сделано, например, в торговых точках — там данные можно ввести со сканера, а можно набить руками.

Что касается введённых символов, то вы их можете все запоминать и все не пропускать, а после того как разберётесь что с ними делать ввод данных можно эмулировать через SendInput. Но этот путь некрасив, ведёт к ошибкам, особенно при использовании спецсимволов или быстрых клавиш.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@asvishnyakov
Программист
Вообще, конечно, решение проблемы напоминает машину Голдберга и интуиция подсказывает, что должно быть решение элегантнее. Но если вас всё ещё интересует как остановить туннелирование события, то делается это с помощью свойства Handled.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы