2008-09-18 21 views
12

J'ai un système où j'ai plusieurs claviers et j'ai vraiment besoin de savoir de quel clavier provient le coup de clé. Pour expliquer la mise en place:Claviers multiples et crochets de bas niveau

  1. J'ai un clavier PC et USB normale
  2. J'ai un écran VGA externe avec quelques touches non-
  3. Les touches dures sont mappées comme un clavier USB standard, l'envoi d'un nombre limité de codes-clés (F1, F2, Return, + et -)

J'ai un hook de bas niveau (en C# mais qui fait appel à la fonctionnalité Win32) qui est capable de gérer l'entrée même quand mon application n'est pas ciblée.

Le problème est que lors de l'utilisation du clavier normal, certains des codes-clés mappés lors de la prise en charge par l'application sont pilotés sur l'écran externe. L'une des touches appuyées par l'écran externe et utilisée pour la confirmation est VK_RETURN. À moins que je puisse identifier le «périphérique» et filtrer dessus, l'utilisateur pourrait effectuer des actions et les confirmer sur un écran qu'il ne regarde même pas. Comment puis-je savoir quel clavier était responsable de l'appui sur la touche?

+0

J'ai répondu à cette question ici: [Comment détecter le périphérique d'entrée si la souris et le touchpad sont activés] (http://stackoverflow.com/a/8804862/1000282). La réponse utilise une bibliothèque c et les pilotes que j'ai créés. –

+0

Pas strictement une réponse à ma question. La réponse marquée comme correcte a bien fonctionné pendant plusieurs années. –

+0

@ ray-haves Pouvez-vous confirmer si vous êtes en mesure d'empêcher l'entrée de _making_ pour d'autres applications, même après que vous l'ayez filtré? C'est-à-dire, une fois qu'une frappe est filtrée à travers une entrée brute, êtes-vous capable de l'empêcher d'être traitée par le reste du système d'exploitation? –

Répondre

14

Oui, je suis corrigé, ma mauvaise, apprendre quelque chose de nouveau tous les jours.

Voilà ma tentative de faire pour elle :):

  • Enregistrez les périphériques que vous souhaitez utiliser pour l'entrée brute (les deux claviers) avec :: RegisterRawInputDevices().

  • Vous pouvez obtenir ces appareils de GetRawInputDeviceList()

  • Une fois que vous avez enregistré vos appareils, vous commencerez à recevoir des messages WM_INPUT.

  • Le lParam du message WM_INPUT contient une structure RAWKEYBOARD que vous pouvez utiliser pour déterminer le clavier où l'entrée est venu, plus le keycode virtuel et le type de message (WM_KEYDOWN, WM_KEYUP, ...)

  • Vous pouvez donc définir un drapeau indiquant d'où provient le dernier message, puis l'envoyer aux gestionnaires d'entrée habituels du clavier.

+0

J'ai un problème similaire maintenant que j'ai besoin d'obtenir plusieurs événements tactiles. avez-vous un exemple plus détaillé? – user1865027

-3

Aucun moyen de le faire. Windows résume cela pour vous. Comme mentionné, vous devez écrire/modifier un pilote de périphérique.

+0

Eh bien, c'est dommage. Je vais me tourner vers les fabricants d'appareils et voir s'il y a un moyen de faire clignoter le matériel pour utiliser différents codes-clés (avec un peu de chance dans les chiffres élevés de VK_Fn). –

+1

Ne pas accepter cela car il semble que c'est possible sans un pilote basé sur la réponse de A Nony Mouse. –