crochet du clavier global de haut niveau pour C # et WPF pour la lecture d'un scanner de carte de coin du clavier

StackOverflow https://stackoverflow.com/questions/2137099

Question

Le seul crochet du clavier pris en charge pour le code managé .NET est un crochet du clavier à faible niveau (WH_KEYBOARD_LL).

Utiliser crochet du clavier global (WH_KEYBOARD_LL) dans WPF / C #

J'ai le code ci-dessus travailler dans mon application au moment de sorte que lorsque vous utilisez votre carte, vous obtiendrez une liste de toutes les frappes. Le problème est pour taper delimiter caractères tels que « % » et « ; » il me envoyer Alt + + Numpad? WPF objets clés correspondant à ces symboles.

Ma question: Y at-il un moyen de rendre ce comportement plus haut niveau, qui est, pour capturer une chaîne générée à partir de toutes les commandes du clavier

?

Vive!

Était-ce utile?

La solution

Je ne sais pas ce qui se passe, mais obtenir un personnage comme% sur un crochet du clavier est très untrivial. Le crochet ne vous avertit des touches virtuelles. Mais% est une clé de frappe, produit en appuyant sur Maj + 5 sur mon clavier (une mise en page des États-Unis). Windows produit normalement ces caractères en traitant les messages WM_KEYDOWN / UP, générant un message WM_CHAR pour la clé de frappe. Cela ne se passe pas dans votre cas. La fonction Windows de bas niveau qui est le fait ToUnicodeEx ().

Autres conseils

Je suppose que si vous glisser la carte, il y a une entrée quelque part sur la forme WPF, comme une zone de texte par exemple? Ensuite, je serais enclin à ajouter un événement, peut-être un gestionnaire d'événement KeyUp, (Le scanner de carte de coin du clavier n'envoie une fin de traitement du signal, comme ENTRER pour indiquer le swipe a réussi oui?), Dans le KeyUp gestionnaire d'événements, construire une chaîne à l'aide StringBuilder, et lorsque le signal de fin de traitement, comme ENTRER est pris, vous pouvez supprimer le « % » et « ; » de l'instance StringBuilder et faire tout ce que vous devez faire.

Il est peut-être plus facile d'utiliser un système d'état, lorsque le gestionnaire d'événements KeyUp reçoit un « % », puis entrer dans un autre État où l'état final serait « ; »

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;
}

Hope this helps, Meilleures salutations, Tom.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top