2010-01-26 4 views
0

Le seul hook clavier pris en charge pour le code managé .NET est un hook de clavier de bas niveau (WH_KEYBOARD_LL).Crochet de clavier global haut de gamme pour C# et WPF pour la lecture d'un scanner de carte à clavier

Voir Using global keyboard hook (WH_KEYBOARD_LL) in 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 de taper des caractères de délimitation tels que "%" et ";" il m'enverra Alt + Numpad +? WPF Objets clés correspondant à ces symboles.

Ma question: Y a-t-il un moyen de rendre ce comportement plus haut niveau, c'est-à-dire de capturer une chaîne générée à partir de toutes les commandes du clavier?

À la votre!

Répondre

0

Vous ne savez pas exactement ce qui se passe, mais obtenir un caractère comme% sur un clavier n'est pas très réaliste. Le hook ne vous avertit que des clés virtuelles. Mais% est une touche de frappe, produite en appuyant sur Shift + 5 sur mon clavier (une disposition US). 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. Ce n'est pas le cas dans votre cas. La fonction Windows de bas niveau qui fait cela est ToUnicodeEx().

+0

Merci pour votre aide nobugz, je vais jeter un oeil à ToUnicodeEx(). J'ai trouvé une question sur la façon d'y parvenir http://stackoverflow.com/questions/370754/convert-a-keycode-to-the-relevant-display-character – vaughan

0

Je suppose que si vous balayez la carte, il y a une entrée quelque part dans le formulaire 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 clavier envoie un signal de fin de traitement comme ENTER pour indiquer que le balayage a réussi, oui?), Dans le gestionnaire d'événements KeyUp, Construire une chaîne en utilisant StringBuilder, et quand le signal de fin de traitement comme ENTER est attrapé, vous pouvez alors supprimer le "%" et ";" à partir de l'instance StringBuilder et faites tout ce que vous avez à faire avec.

Il peut être plus facile d'utiliser un système d'état lorsque le gestionnaire d'événements KeyUp reçoit un "%", puis entrez un autre état où l'état final attendu sera un ";"

 
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.

+0

Il n'y a pas d'entrée sur mon formulaire. Pour éviter les problèmes de perte de focus de la zone de texte ou de l'application, j'utilise un raccourci clavier qui devrait effectuer cette tâche de manière invisible pour l'utilisateur. – vaughan

+0

@reckoner: Hmmm ... et où vont les données balayées? Sûrement vous avez quelque chose sur le formulaire qui dit quelque chose comme «balayez s'il vous plaît» oui? Et qu'entendez-vous par «éviter les problèmes avec la zone de texte ou l'application perdre le focus»? Utilisez-vous un programme tiers (probablement fourni avec le scanner) pour lire les données glissées? – t0mm13b

+0

L'interface va être un écran tactile où les utilisateurs naviguent à travers les pages d'informations dans toute la fraîcheur de WPF. Les données glissées sont interceptées et stockées dans une base de données et affichent une notification discrète. C'est pour assister à l'événement. – vaughan

Questions connexes