Высокоуровневая глобальная клавиатурная зацепка для C # и WPF для чтения сканера клавиатурных карт - PullRequest
0 голосов
/ 26 января 2010

Единственный перехват клавиатуры, поддерживаемый для управляемого кода .NET, - перехват клавиатуры низкого уровня (WH_KEYBOARD_LL).

См. Использование глобальной клавиатуры (WH_KEYBOARD_LL) в WPF / C #

В данный момент у меня в приложении работает приведенный выше код, поэтому, когда вы проводите по карте, вы получаете список всех нажатий клавиш. Проблема заключается в наборе символов-разделителей, таких как «%» и «;» это отправит мне Alt + Numpad +? WPF Ключевые объекты, соответствующие этим символам.

Мой вопрос: есть ли способ заставить его вести себя на более высоком уровне, то есть захватить строку, сгенерированную всеми командами клавиатуры?

Ура!

Ответы [ 2 ]

0 голосов
/ 26 января 2010

Я думаю, если вы проводите карту, есть ли где-нибудь в форме wpf ввод, например, текстовое поле? Затем я был бы склонен добавить событие, возможно, обработчик события KeyUp, (сканер карты клина клавиатуры отправляет сигнал об окончании обработки, такой как ENTER, чтобы указать, что считывание прошло успешно, да?) создайте строку, используя StringBuilder, и когда сигнал об окончании обработки, такой как ENTER, перехватывается, вы можете удалить «%» и «;» из экземпляра StringBuilder и делайте с ним все, что вам нужно.

Может быть проще использовать систему состояний, когда обработчик событий KeyUp получает «%», а затем перейти в другое состояние, где конечное ожидаемое состояние будет «;»

static bool StartState = false;
StringBuilder sbInput = new StringBuilder();
private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
   if (!StartState){
    if (e.KeyCode == Keys.D5) StartState = true;
    sbInput.Append((char)e.KeyValue);
   }else{
    if (e.KeyCode == Keys.OemSemicolon){
       StartState = false;
       // sbInput will contain the data from the scanner,
       // copy it somewhere else and reset sbInput
       // sbInput.Remove(0, sbInput.Length); 
    }
    sbInput.Append((char)e.KeyValue);
   }
   e.Handled = true;
}

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0 голосов
/ 26 января 2010

Не уверен, что происходит, но получить символ, такой как%, из клавиатуры не очень удобно. Хук только уведомляет вас о виртуальных ключах. Но% - это клавиша для ввода, которая создается нажатием Shift + 5 на моей клавиатуре (раскладка в США). Обычно Windows создает эти символы, обрабатывая сообщения WM_KEYDOWN / UP, генерируя сообщение WM_CHAR для клавиши ввода. Это не происходит в вашем случае. Низкоуровневая функция Windows, которая делает это, ToUnicodeEx ().

...