Déterminer quel clavier envoie des frappes

J’ai 2 claviers connectés à ma machine (un sur PS / 2, l’autre sur USB). Comment déterminer quel clavier envoie les frappes au clavier en C #?

Voici un exemple de code très sale montrant comment utiliser le hook d’entrée Windows à partir de .NET. Fonctionne mieux avec Snippet Comstackr:>

EDIT: il s’avère qu’il y a une limite de longueur pour les messages,

récupérez le code source ici

.

Si vous utilisez une clé USB, vous devriez pouvoir le comprendre, au moins au niveau du pilote. Cependant, plus haut dans la stack, je n’ai pas entendu parler d’une telle option. Je ne serais pas surpris si ce n’était pas possible du tout.

Les simulateurs de danse sont une avenue à découvrir. Vous savez, ceux avec le “tapis de danse” (ou “tapis de danse”). Ces tapis de danse ne sont en réalité rien d’autre que de grands claviers. Vérifiez par vous-même – ouvrez le bloc-notes et sautez sur le tapis de danse. 🙂

Maintenant, certains de ces programmes offrent également un mode compétitif où vous pouvez connecter deux tapis de danse et rivaliser avec un partenaire. Dans ce cas, ils doivent faire la distinction entre les tapis – ce qui revient au même que vous essayez de faire.

Je suppose que le problème est que, lorsque le lecteur de codes à barres est utilisé, le numéro entre dans le champ actif plutôt que dans le champ pour l’ID de code à barres?

Une solution serait de relier les événements OnChange des autres champs et de rechercher un numéro de code à barres inséré dans ceux-ci (via RegEx). Si trouvé, déplacez le code à barres hors de ce champ et déplacez la valeur vers le champ de code à barres.

Aucun access de périphérique requirejs, cela pourrait même être fait sur une page Web basée sur Javascript.

Ok, voici une méthode vraiment compliquée qui ne fonctionnerait qu’avec un sous-ensemble très limité de cas d’utilisation:

  1. Tape, colle ou raccourcit un ensemble de touches de modification (Ctrl droite, par exemple) sur l’un des claviers.
  2. Sur chaque pression de touche, regardez les modificateurs. Si les modificateurs sont définis comme ils le seraient sur le clavier collé, supposons que ce clavier soit la source. Sinon, supposons que c’est l’autre clavier.

Limites:

  1. Vous ne pouvez pas utiliser le clavier collé en dehors de votre application, car seul celui-ci sait ignorer les touches de modification.
  2. Vous ne pouvez pas utiliser ces touches de modification dans votre propre application dans le cadre de raccourcis clavier.
  3. L’autre clavier peut emprunter l’identité de la vôtre (accidentellement ou non) si l’utilisateur appuie sur les boutons appropriés.
  4. Vous devrez désactiver StickyKeys.
  5. Utiliser Alt ou Ctrl a un inconvénient: si vous appuyez sur l’ autre , Windows aura peut-être une utilisation de cette combinaison que votre application ne pourra pas saisir.

Inconnu n ° 1 : si ModifierKeys est uniquement renseigné à partir du clavier à l’origine du clic, ou provient de la sum de tous les modificateurs de tous les claviers connectés. Je soupçonne que chaque clavier envoie en interne les modificateurs attachés à la frappe et que Windows ne les regroupe pas.

Inconnu # 2 : si System.Windows.Forms.Control.ModifierKeys fournit uniquement des bits Ctrl / Maj / Alt, ou fournit suffisamment de détails pour, par exemple, distinguer la touche Ctrl droite de la gauche. Voici les clés que vous pourriez théoriquement tester, je ne sais pas combien sont fournies via ModifierKeys:

http://msdn.microsoft.com/en-us/library/system.windows.forms.keys.aspx

Je pense que la seule façon de le faire serait de surveiller le trafic USB. J’ai vu des programmes qui font cela, mais je ne sais pas comment le faire en C #. Ainsi, s’il y a du trafic USB et une frappe, c’est le clavier USB. S’il n’y a pas de trafic, c’est le PS / 2.

Naturellement, l’autre inconvénient à cela est qu’il ne se généralise pas aux types de connexion de clavier arbitraires ou futurs.