Лучший способ обработки ввода с клавиатуры «клин» - PullRequest
6 голосов
/ 03 сентября 2008

Я пишу систему C # POS (точка продажи), которая получает данные от считывателя магнитных карт на клавиатуре. Это означает, что любые данные, считываемые с магнитной полосы, вводятся так, как если бы они были набраны на клавиатуре очень быстро. В настоящее время я справляюсь с этим, присоединяясь к событию KeyPress и ищу серию очень быстрых нажатий клавиш, которые содержат сторожевые символы удара карты.

Есть ли лучший способ справиться с такого рода вводом?

Редактировать: устройство просто представляет данные как нажатия клавиш и не взаимодействует через какой-либо другой драйвер. Также мы используем широкий спектр этих типов устройств, поэтому в идеале метод должен работать независимо от конкретной модели используемого клина. Однако, если нет другого выбора, мне придется обойтись.

Ответы [ 5 ]

10 голосов
/ 03 сентября 2008

Одна вещь, которую вы можете сделать, это то, что вы должны быть в состоянии сконфигурировать ваше устройство чтения клинов так, чтобы оно представляло один или несколько escape-символов до или после строки. Вы должны использовать эти escape-символы, чтобы знать, что у вас есть (или только что был) вход для магнитной карты.

Этот же метод используется устройствами чтения штрих-кодов, поэтому ваше приложение знает, как получить фокус или обработать ввод данных с устройства.

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

Это предполагает, что ваши устройства просто представляют данные как нажатия клавиш и не взаимодействуют через какой-либо другой драйвер.

3 голосов
/ 26 февраля 2009

Вы также можете использовать Raw Input API, если заранее знаете идентификаторы оборудования устройств. Я недавно писал об этом в блоге. Это может быть безумно, но это удовлетворило мое требование: основная цель в моем случае состояла в том, чтобы иметь возможность получать информацию, даже когда приложение потеряло фокус, потому что кто-то случайно натолкнулся на что-то, пока шарил вокруг сканировать предметы на поддоне. Вторичная цель состоит в том, чтобы я не мог добавить никаких сторожевых символов, потому что это сломало бы существующие сторонние приложения, используемые со сканерами.

Ранее я использовал символьный метод часового типа, однако, либо через KeyPress присоединение, либо через низкоуровневый хук клавиатуры через SetWindowsHookEx() или через KeyPreview в главной форме вашего приложения. Если он соответствует вашим требованиям, этот метод, безусловно, будет намного проще и проще, и для этого я подкреплю уже приведенные рекомендации.

2 голосов
/ 04 сентября 2008

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

также если вы распространяете свое программное обеспечение на другие территории, то нажатия клавиш могут быть другими, например, в Испании (думаю, но может быть во Франции) верхняя строка клавиатуры - это! "£ $% ^ & () в отличие от США / Великобритании 1234567890, и если для устройства чтения карт установлено значение usa / uk, он отправит! "£ $% ^ & () вместо 1234567890, поскольку клин просто эмулирует этот ключ была нажата, и если Windows интерпретирует его по-другому, то это ваша проблема.

1 голос
/ 04 сентября 2008

Еще один голос за идею jttraino . То же самое я делаю со считывателями карт и чековыми считывателями в точках продаж, где нам необходимо поддерживать раскладку клавиатуры, а также USB и RS232.

По сути, выберите короткую последовательность символов, которые вряд ли будут поступать с клавиатуры, и запрограммируйте цикл обработки сообщений, чтобы увидеть поступление этих символов. Если вы получите законченный поток символов, соответствующий вашему шаблону, вы можете декодировать оставшуюся часть ввода, пока не достигнете назначенной последовательности 'end' или пока не решите, что входящая последовательность ошибочна. Выберите строку, которую сложно или невозможно ввести с обычной клавиатуры в ваше приложение, учитывая такие вещи, как редактирование масок и поведение различных экранов.

Хорошая отправная точка - это что-то вроде тильды (~!), Поскольку эти символы вряд ли появятся в личных данных кого-либо и вряд ли когда-либо появятся вместе в тексте заметки и т. Д. :-)

Недостатком, как сказал jttraino, является то, что вам, вероятно, придется настраивать / программировать каждое устройство чтения самостоятельно. Некоторые производители делают это довольно легко - чей комплект вы используете? Magtek? Уэлч Аллин?

0 голосов
/ 04 сентября 2008

Я второй @ jttraino's идея .

Это способ использовать сканеры штрих-кодов / считыватели кодов и другие устройства с поддержкой технологии Plug and Play (PnP). В моем предыдущем задании я использовал ту же технику для настройки пары 1D и 2D сканеров штрих-кода.

...