Librairie rawinput .net

Soyez le premier à donner votre avis sur cette source.

Vue 18 094 fois - Téléchargée 1 047 fois

Description

RawInput .NET est un wrapper managé de l'API Win32 du même nom, qui permet de gérer tous les périphériques répondant à la norme USB/HID ainsi que de gérer plusieurs souris ou plusieurs claviers. (chose que même DirectInput ne sait pas faire.)

J'ai fait le choix de faire un wrapper assez proche de la librairie originale, (une unique classe et un seul évènement statique pour tous les types de périphériques) ce qui permet de garder de bonnes performances et ne nécessite pas d'apprentissage si on connait la version Win32.

Conclusion :


La documentation n'est pas compilée, l'éditeur de Visual Studio n'affiche qu'une partie de l'aide, utilisez par exemple l'explorateur d'objets pour visualiser certaines remarques contenues dans les commentaires XML.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Lutinore
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
29 -
hi, I don't know VB.NET..

The DLL is CLS-compliant and should be able to run in VB.NET.

I think you have a namespace conflict.

The only namespace useful is "Windows.RawInput"

Try to create an alias for the namespace.

Imports WinRawInput = Windows.RawInput
ilens
Messages postés
1
Date d'inscription
jeudi 2 décembre 2010
Statut
Membre
Dernière intervention
2 décembre 2010
-
(Je suis Anglais - donc j'ecrit la francais tres mal!)

Quand j'utilise le DLL en VB.net, et je tick "Windows.Rawinput" le Namespace "System.Windows" ne marche en plus. par example, j'ai recu le message de compilation "'Form' is not a member of Windows". Si je ne tick pas "Windows.Rawinput", il n'y a plus le message, mais maintenant je voir "Name 'RawDevice' is not declared."

Aidez-mais, s'il vous plait!

When I install the RawInput.net DLL in VB.net, and I tick "Windows.Rawinput" in "References", the Namespace "System.Windows" does not work any more - for example, I get the compiler message "'Form' is not a member of Windows" against "system.windows.form.dialogresult.cancel". If I don't tick "Windows.Rawinput", I don't the Form error but I get "Name 'RawDevice' is not declared."
Lutinore
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
29 -
Salut, tu trouveras les valeurs dans "Universal Serial Bus HID Usage Tables" :

http://www.usb.org/
http://www.usb.org/developers/devclass_docs/Hut1_11.pdf

Ton périphérique semble être reconnu comme un "Multi-axis controler".

Je ne comprends pas bien quand tu parles de la limite de taille des packets à envoyer, Rawinput permet de recevoir les données du hardware mais pas d'en envoyer ni de les simuler.

Le membre RAWHID.dwSizeHid contient la taille des données envoyées par le device, c'est une structure dont seul le fabriquant connait la disposition mais en tâtonnant on devine très vite la disposition.

Cette structure peut avoir été envoyée plusieurs fois et dans ce cas RAWHID.dwCount indique le nombre. (en pratique il semble que ce soit toujours 1).

La taille du buffer RAWHID.bRawData est donc égale à dwSizeHid * dwCount.

Je te conseille vivement d'utiliser WM_INPUT c'est bien plus simple et beaucoup mieux documenté, j'ai fait un exemple avec GetRawInputBuffer pour montrer comment ça marche mais à mons avis cette méthode doit être reservée pour les périphériques qui génèrent beaucoup de données à la seconde comme des périphériques audio ou vidéo.
TeBeCo
Messages postés
467
Date d'inscription
lundi 24 juin 2002
Statut
Membre
Dernière intervention
9 mars 2011
-
Ton bout de code remonte y a un petit bout de temps, il se peux donc que mes questions semblent dérangeantes ^^

je travaille actuellement sur une source (certes en C++) mais toujours sur les Raw Inputs.
J'interface une "Souris 3D" de chez 3DConnexion : http://www.3dconnexion.com/products/spaceexplorer.html
J'arrive "presque" à tout faire avec mon code ...
Cependant j'ai quelques interrogation,

La première concerne la structure RAWINPUTDEVICE : http://msdn.microsoft.com/en-us/library/ms645565(VS.85).aspx
en particulier les 2 membres
USHORT usUsagePage;
USHORT usUsage;
Je n'ai pas réussi à trouver de page montrant une table des valeur dedans, je suppose que les valeur dedans évolue dans le temps, mais je n'ai pas trouvé ne serait-ce que les standards. En bidouillant dans le code je sais que ma souris me renvois 0x01 et 0x08, mais je n'ai pas de référence pour comparer/comprendre cette valeur.

La deuxième concerne la lecture d'un paquet reçu via WM_INPUT, via un GetRawInputData( lParam, ....)
je récupère donc une structure du type RAWHID : http://msdn.microsoft.com/en-us/library/ms645549.aspx
et la je ne suis pas vraiment sur de savoir comment comprendre la doc pour les différent membre, si je comprend bien les 2premiers membres indique la taille et la quantité de "case" dans bRawData, qui lui est un pointeur sur le premier élément du tableau ?
si oui ... c'est la ou ca devient pas drôle mais ... j'ai pas trouvé de limite a la quantité d'info qu'on peux passé par packet, est ce que je doit en conclure qu'on peux en envoyé sans se poser de question sur la taille ?
De plus le device en question envoi sur le premier octet (donc bRawData[0]) une valeur me permettant de déterminer le type de message (bouton, rotation, translation).
En regardant le SDK (de la souris) en détails, j'ai remarqué que dans un exemple il récupère un pointeur à l'adresse bRawData[1] (celui ci pointe sur les valeur réelle de la souris). Problème étant ... x86 / x64 et Alignement,
1 : je pose pas ma question au bon endroit ?
2 : unsigned long value = *( (long *)(&(hid.bRawData[1])) ) <=== est ce que l'alignement va pas mettre le boxon la dedans sachant que je me suis récemment mis au C++ et que je dis probablement une connerie ....
3 : les pointeurs en x64 c'est jolie, mais ..., ca mettrait pas encore PLUS le dawa dans tout ca ? ou alors Windows saura le gérer au moment ou il allouera bRawData et qu'il écrira la valeur dedans
D : la réponse D

et enfin, dernier problème plutôt orienté Architecture et Performances et un peu plus détaché de cette source
durant mes recherche j'ai vu que pour récupérer les valeurs envoyées par la souris j'avais 2 moyen à ma disposition :
1 : via le WM_INPUT de ma fenêtre
2 : via la GetRawInputBuffer(...) dans une boucle + Timer
Dans ton code tu utilises la 2ieme méthode, pour des questions de simplicité et apprentissage j'ai utilisé la première. Sachant que je vais l'intégrer à des application intégrant un rendu 3D, que conseillerais-tu comme "schéma de traitement", je ne demande pas de code tout fait ou quoi, si j'utilise la première méthode, j'aurais des message différé vis-à-vis de la boucle de rendu et j'aurais a jonglé entre 2 état : actuel / dernier état lors du dernier rendu (multithreading de Dx11 mise a part sinon je vais crisé), si j'utilise la méthode 2, il faudra que je traite (je présume) l'intégralité du buffer jusqu'à épuisement + filtrer les type de paquet (rotation, boutton ...) pour être sur de l'état "final" (le device envoi 1 paquet par action, il n'émet pas en continu)

Et finalement :
"Dans 4 ans la prochaine :D"
Gaffe te restes qu'un ans
Lutinore
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
29 -
Un handle à zéro signifie un device virtuel généré par Windows ou un device simulé depuis un autre et dans ce cas GetRawDevice( ) renvoie null puisque le device n'existe pas, c'est ce qui provoque une exception dans ton code. Mais même avec un handle à zéro tu devrais pouvoir utiliser ce device correctement sans qu'il interfère avec les autres souris.

Essaye d'utiliser le flag InputMode.BackgroundMode dans RegisterRawDevices pour voir si tu reçois les events du stylet avec son vrai handle.

Sinon tourne toi vers des API dédiées au tablet PC comme "RealTimeStylus".

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.