Pergunta

Estou escrevendo um sistema C # POS (ponto de venda) que recebe informações de um leitor de cartão magnético com teclado.Isso significa que quaisquer dados lidos em uma tarja magnética são inseridos como se tivessem sido digitados no teclado muito rapidamente.Atualmente estou lidando com isso anexando ao evento KeyPress e procurando uma série de pressionamentos de tecla muito rápidos que contenham os caracteres sentinela de deslizar o cartão.

Existe uma maneira melhor de lidar com esse tipo de entrada?

Editar:O dispositivo simplesmente apresenta os dados como pressionamentos de tecla e não faz interface por meio de outro driver.Também usamos uma ampla variedade desses tipos de dispositivos, portanto, idealmente, um método deve funcionar independentemente do modelo específico de cunha que está sendo usado.No entanto, se não houver outra opção, terei que me contentar.

Foi útil?

Solução

Uma coisa que você pode fazer é configurar seu leitor de cunha para que ele apresente um ou mais caracteres de escape antes ou depois da string.Você usaria esses caracteres de escape para saber que está prestes a receber (ou acabou de receber) uma entrada de cartão magnético.

Essa mesma técnica é usada por dispositivos leitores de código de barras para que seu aplicativo saiba como obter foco ou lidar com a entrada de dados do dispositivo.

O negativo dessa abordagem é que você precisa configurar adequadamente seus dispositivos externos.Isso pode ser um problema de implantação.

Isso pressupõe que seus dispositivos simplesmente apresentem os dados como pressionamentos de tecla e não façam interface por meio de outro driver.

Outras dicas

Você também pode usar a API Raw Input se souber antecipadamente os IDs de hardware dos dispositivos. Eu escrevi sobre isso recentemente. Pode ser uma loucura, mas satisfez minha exigência:o objetivo principal no meu caso era poder receber informações mesmo quando o aplicativo perdia o foco porque alguém acidentalmente esbarrou em algo enquanto vasculhava para digitalizar itens em um palete.O objetivo secundário é que eu não pudesse adicionar nenhum caractere sentinela porque isso quebraria os aplicativos de terceiros existentes usados ​​com as armas de varredura.

Já fiz o método do personagem sentinela antes, porém, tanto por meio de um KeyPress anexar ou um gancho de teclado de baixo nível via SetWindowsHookEx() ou através KeyPreview no formulário principal da sua aplicação.Se atender aos seus requisitos, é definitivamente muito mais simples e fácil usar esse método e, para esse fim, apoio as recomendações já dadas.

Acho que você está lidando com isso de uma maneira aceitável, apenas tome cuidado com a rapidez com que o cartão envia os dados, temos scanners de código de barras sem fio e, de vez em quando, eles pressionam as teclas no teclado rapidamente para o aplicativo lidar.

Além disso, se você estiver distribuindo seu software para outros territórios, os toques nas teclas podem ser diferentes, por exemplo, na Espanha (eu acho, mas pode ser na França), a linha superior do teclado é !"£$%^&() oposto aos EUA/Reino Unido 1234567890, e se o seu leitor de cartão estiver configurado para EUA/Reino Unido, ele enviará !"£$%^&() no lugar de 1234567890, já que a cunha apenas emula a tecla que foi pressionada e se o Windows interpretar de forma diferente, então o problema é seu.

Mais um voto para ideia do jttraino.Faço praticamente o mesmo com leitores de cartões e leitores de cheques em sistemas de pontos de venda onde precisamos suportar teclado, bem como USB e RS232.

Basicamente, escolha uma sequência curta de caracteres que provavelmente não virão do teclado e programe seu loop de tratamento de mensagens para ver esses caracteres chegando.Se você obtiver um fluxo completo de caracteres que corresponda ao seu padrão, poderá decodificar o restante da sua entrada até atingir a sequência 'final' designada ou até decidir que a sequência recebida está errada.Selecione uma string que seja difícil ou impossível de inserir no teclado normal em seu aplicativo, considerando coisas como máscaras de edição e o comportamento de suas várias telas.

Um bom ponto de partida é algo como tilda-pling (~!), pois esses caracteres provavelmente não aparecerão nos dados pessoais de ninguém e provavelmente nunca precisarão aparecer juntos no texto de uma nota, etc.:-)

A desvantagem, exatamente como jttraino disse, é que você provavelmente terá que configurar/programar cada dispositivo leitor.Alguns fabricantes tornam isso bastante fácil de fazer - qual kit você está usando?Magtek?Bem Allyn?

eu segundo Ideia do @jttraino.

É a melhor opção para leitores de código/leitura de barras e outros dispositivos plug and play (PnP).Usei a mesma técnica para configurar alguns leitores de código de barras 1D e 2D em meu trabalho anterior.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top