Gancho de teclado global de alto nível para C# e WPF para ler um scanner de cartão de cunha do teclado
-
22-09-2019 - |
Pergunta
O único gancho de teclado suportado para o código gerenciado .NET é um gancho de teclado de baixo nível (WH_KEYBOOLE_LL).
Ver Usando o gancho global de teclado (wh_keyboard_ll) em wpf / c#
Eu tenho o código acima que trabalha no meu aplicativo no momento, para que, quando você deslizar o seu cartão, obtenha uma lista de todas as teclas. O problema é digitar caracteres delimitadores, como "%" e ""; Isso vai me enviar alt+numpad+? Objetos -chave WPF correspondentes a esses símbolos.
Minha pergunta: existe uma maneira de tornar esse comportamento mais alto, ou seja, para capturar uma string gerada a partir de todos os comandos do teclado?
Felicidades!
Solução
Não tenho certeza do que está acontecendo, mas tirar um personagem como % de um gancho de teclado não é muito não. O gancho apenas notifica você de chaves virtuais. Mas % é uma tecla de digitação, produzida pressionando o Shift + 5 no meu teclado (um layout dos EUA). O Windows normalmente produz esses caracteres processando as mensagens WM_KEYdown/UP, gerando uma mensagem WM_CHAR para a tecla de digitação. Isso não está acontecendo no seu caso. A função Windows de baixo nível que faz isso é tounicodeex ().
Outras dicas
Eu acho que se você estiver passando o cartão, há uma entrada em algum lugar no formulário WPF, como uma caixa de texto, por exemplo? Então eu estaria inclinado a adicionar um evento, talvez um manipulador de eventos KeyUp (o scanner de cartão de cunha do teclado envia um sinal de final de processamento, como Enter para indicar que o furto foi bem-sucedido sim?), No manipulador de eventos KeyUp, Construa uma string usando StringBuilder e, quando o sinal de final de processamento como Enter for capturado, você pode remover o "%" e ";"; Na instância do StringBuilder e faça o que você tem a ver com isso.
Pode ser mais fácil usar um sistema estadual, quando o manipulador de eventos KeyUp receber um "%", entre em outro estado em que o fim do estado esperado seria um "";
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; }
Espero que isso ajude, cumprimentos, Tom.