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!

Foi útil?

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.

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