La lecture USB HID scanner de code à barres d'entrée sans savoir VID&PID
Je suis en train de développer appareil indépendant de la bibliothèque pour les scanners de codes à barres, il doit travailler dans l'environnement windows.
J'ai fait quelques recherches dans ce domaine, autant que je sache, la plupart des solutions de ce problème sont, en fonction de l'appareil VID&PID (RawInput @ filtrer par vid&pid chaîne), dans ma situation, c'est inacceptable, parce que je suis en train de développer un appareil indépendant de la solution qui sera de travailler avec n'importe quel port USB-scanner de code à barres.
En fait, cette chose est assez difficile, pour moi au moins, ici, sont exactes requiriments. Aussi je ne peux pas demander à l'utilisateur d'enfichage à chaud des périphériques (dans ce cas, j'ai viens de détecter l'appareil branché et il extrait vid/pid). Aussi je ne peux pas utiliser VID&PID de la base de données de périphériques. En général, je ne peux pas utiliser vid&pid du tout, en fait.
Aussi je ne peux pas en aucune façon reprogrammer scanner de code à barres, sauf si c'est fait à partir de mon programme (peut-être que je peux envoyer de l'barcodescanner-IOCTLs spécifiques, ce qui va rendre réponse à moi?).
Actuellement, je vais utiliser la solution proposée dans cette question:
La lecture d'un code-barres à l'aide d'un USB scanner de code à barres avec en ignorant clavier de saisie des données de tout scanner id de produit et l'id du fournisseur ne sont pas connus
J'ai également vu bibliothèque commerciale (ce qui est offcourse sans sources et aucune info sur la façon dont il est mis en œuvre, mais en considérant qu'ils ont avais quelques mot "Performance counter" dans leur changelogs, je suppose qu'ils ont utilisé la solution dans le lien ci-dessus), qui implémente cette fonctionnalité, mais il ne fonctionne pas dans les systèmes x64. Probablement en raison de code désordre ou dans la mesure où il utilise probablement une sorte de filtre (mini) pilote. C'est cryptée et je ne peux pas le redistribuer.
Ma question exacte est:
Est-il possible de déterminer que ce clavier HID est en fait pas un clavier, mais un scanner de code à barres? J'ai vu sur Win 7 x64 qu'il se connecte en tant que lecteur de code-Barres, pas de clavier (ce qui était un système de bug, ou en quelque sorte).
Exactement ce que je fais aujourd'hui:
- Lire les entrées par RID_INPUTSINK.
- Distinguer toutes les entrées par des vid&pid de l'appareil
- Mettre tous entrée pour séparer les tampons et la collecte de codes-barres à partir de la mémoire tampon lors de la VK_ENTER montre de la mémoire tampon.
Ce que je suis en train de faire va faire:
- Lire l'entrée par RID_INPUTSINK
- Démarrer la minuterie particulières de l'appareil, et si le prochain symbole est VK_ENTER - chronomètre d'arrêt
- Si la minuterie est supérieure à 50 ms limite - off et la chute de tous les autres périphériques d'entrée.
- Si l'appareil va réussir à lire la séquence de caractères à partir de la première symbole de VK_ENTER - extrait appareil VID&PID/gérer et de travailler avec elle dans la plus pratique (sans timering).
Je suis developng sur C++, pur WinAPI, il sera une bibliothèque DLL, et j'ai commencé à travailler dans Windows XP, Vista, 7, 8 sur 32 86 et x32-64 architectures.
Mise à JOUR 0:
Juste trouvé que scanner de code à barres ont leur propre usagePage et l'utilisation de l'USB spécifications:
http://www.usb.org/developers/devclass_docs/pos1_02.pdf
Selon ce document, USB code à Barres scanneur ont UsagePage 0x8C et l'Utilisation 0x02. Malheureusement, je n'ai pas réussi à l'utiliser comme RAWINPUTDEVICE.dwUsage et RAWINPUTDEVICE.dwUsagePage. Probablement parce que le système de l'installer clavier usb pilote sur le haut et dans le mode utilisateur, il est impossible de distinguer les vrais clavier usb. Probablement ces valeurs sont utilisables dans kernelmode de l'environnement (l'une des options est de développer hid pilote de filtre).
OriginalL'auteur Ivan0x32 | 2012-09-19
Vous devez vous connecter pour publier un commentaire.
Cela ne répond pas à votre question spécifique, mais de toute façon...
Plus d'un an, j'ai mis en œuvre lecteur de code à barres de soutien et même dans les plus mauvaises conditions. C'était pour un formulaire de demande de déclaration auprès de l'association logistiques de données en Java pur (cross platform client riche, principalement sous Windows).
J'ai trouvé la même chose que vous dites sur le pilote du clavier, ce qui empêche la distinction réelle des périphériques USB en mode utilisateur, au moins au premier coup d'œil. Il y a des dispositifs plus coûteux avec des pilotes et des fonctionnalités avancées, ce qui permettrait une sorte de distinction.
Tous les lecteurs de codes-barres que j'ai rencontré dans ce milieu étaient visibles que les claviers et utilisé pour simplement remplir un SAP champ de formulaire, puis appuyez sur la touche entrée, qui est un cas commun. La résiliation peut être configurable à l'aide de la "magie codes-barres" ou d'un autre fabricant de la méthode spécifique.
De sorte que la décision a été contre toute JNI base, plate-forme de mise en œuvre spécifiques.
Au lieu de cela, j'ai mis en place également une interception approche (version étendue de la vôtre) en évaluant générique keyoard d'entrée dans certaines Swing/AWT formes à l'aide de ces critères:
L'entrée est consommé par un tampon jusqu'à ce que les critères pour la machine généré d'entrée ne sont pas remplies, ou la validation a été passé, où les codes à barres les auditeurs seront avisés. Dans les deux cas, l'entrée peut être transmis comme si rien ne se passait.
Ce qui s'est avéré pour être très précis, car pour un homme, c'est tout, mais impossible d'entrer dans une séquence valide au lecteur de code-barres du taux de (presque) zéro de la gigue.
EDIT:
Juste creusé le source Java; je peux vous donner le code d'une première révision de la mise en œuvre ci-dessus comme un exemple (pas de garantie, pensez également à mettre en œuvre CR):
OriginalL'auteur Sam