2010-01-26 2 views
0

Единственный крюк для клавиатуры, поддерживаемый для управляемого .NET-кода, представляет собой низкоуровневый клавиатурный крючок (WH_KEYBOARD_LL).Глобальный клавиатурный крючок высокого уровня для C# и WPF для чтения сканера клавиатуры с клин-картой

См Using global keyboard hook (WH_KEYBOARD_LL) in WPF/C#

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

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

Cheers!

ответ

0

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

+0

Спасибо за вашу помощь nobugz, я посмотрю на ToUnicodeEx(). Нашел вопрос о том, как добиться этого http://stackoverflow.com/questions/370754/convert-a-keycode-to-the-relevant-display-character – vaughan

0

Я бы предположил, что если вы прокручиваете карту, есть вход где-то в форме wpf, например текстовое поле? Тогда я был бы склонен добавить событие, возможно, обработчик события KeyUp (сканер клавиатуры клиновой карты отправляет сигнал завершения обработки, такой как ENTER, чтобы указать, что салфетка прошла успешно да?). В обработчике событий KeyUp, создайте строку с помощью 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

В моей форме нет ввода. Чтобы предотвратить проблемы с потерей фонового текста или приложения, я использую крючок клавиатуры, который должен выполнять эту задачу незаметно для пользователя. – vaughan

+0

@reckoner: Хммм ... и куда идут данные? Наверняка у вас есть что-то в форме, которая говорит что-то вроде «Пожалуйста, проведите пальцем», да? И что вы имели в виду под «предотвращением проблем с текстовым полем или приложением, теряющим фокус»? Используете ли вы стороннюю программу (возможно, поставляемую со сканером) для считывания данных с проверкой? – t0mm13b

+0

Интерфейс будет сенсорным экраном, где пользователи перемещаются по страницам информации во всей прохладе WPF. Исправленные данные перехватываются и сохраняются в базе данных и отображаются ненавязчивое уведомление. Он предназначен для посещения событий. – vaughan

Смежные вопросы