LIBRAIRIE RAWINPUT .NET

Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
- - Dernière réponse : Lutinore
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
- 2 déc. 2010 à 19:58
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/43573-librairie-rawinput-net

cs_Bidou
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
42 -
Hé bien, elle s'est fait attendre cette première source dit-moi !
On espère que de similaires arriveront bientôt ;-)
Lutinore
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
29 -
Dans 4 ans la prochaine :D
cs_coq
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
75 -
Lol
Bien, j'ajoute celà à la liste des trucs à regarder, ça peut être bon à savoir :-)
TheSin
Messages postés
331
Date d'inscription
mardi 12 novembre 2002
Statut
Membre
Dernière intervention
10 février 2009
-
Sympa :-)
Je ne connaissais pas RawInput, ça peut servir :-)
DirectInput gère plusieurs claviers/souris, mais ne permet pas de les utiliser en même temps, un seul périphérique de même type à la fois :(.
Pratique.
Lutinore
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
29 -
TheSin > merci, oui c'est bien de cela que je parle :

"On Microsoft Windows XP, DirectInput enumerates only one mouse and one keyboard device, referred to as the system mouse and the system keyboard. These devices represent the combined output of all mice and keyboards respectively on a system. For information about how to read from multiple mice or keyboards individually on Windows XP, see the WM_INPUT documentation."
Lutinore
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
29 -
Microsoft a sorti récemment MultiPoint SDK une sorte de wrapper autour de l'API RawInput pour .NET 3.0 (WPF) uniquement mais ça semble moins souple et moins rapide que ma petite librairie. :p
cs_coq
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
75 -
Exactement ! :p
cs_djine
Messages postés
26
Date d'inscription
mardi 22 juillet 2003
Statut
Membre
Dernière intervention
11 décembre 2007
-
Très bonne source, je cherchais ça depuis longtemps !

Cependant, j'ai un tabletPC, et lorsque je tente d'utiliser le stylet et la souris en même temps, l'un ou autre se met attente jusqu'à ce qu'un nouvel événement se produise (exemple : MouseUp ou MouseDown).

Donc pas de possibilité d'utiliser le mouvement du stylet et de la souris en parallèle.

Si quelqu'un a une idée, je suis preneur !

9/10.
Lutinore
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
29 -
Merci.. Je ne sais pas comment Windows gère le stylet, d'après ce que tu dis il simule une souris mais je ne vois pas pourquoi ça interfère avec l autre souris.

Avec ce code tu peux énumérer les périphèriques sur ton système.

foreach( RawDevice device in RawDevice.GetRawDevices( ) )
{
RawInfo info = device.GetRawInfo( );
string desc = String.Format
(
"Description: {0}\r\n" +
"Handle: {1}\r\n" +
"Type: {2}\r\n" +
"Page: {3}\r\n" +
"Usage: {4}",
device.Description,
device.Handle,
device.RawType,
info.UsagePage,
info.Usage
);
MessageBox.Show( this, desc, "Info" );
}
cs_djine
Messages postés
26
Date d'inscription
mardi 22 juillet 2003
Statut
Membre
Dernière intervention
11 décembre 2007
-
Voila la liste des devices de type mouse que j'obtiens sur mon portable sens aucune souris branché :
- Description: Wacom Mouse,Handle: 65615, Type: Mouse, Page: 1, Usage: 2 (WACOM -> tablet)
- Description: Souris HID,Handle: 65613, Type: Mouse, Page: 1, Usage: 2
- Description: Souris HID,Handle: 65611, Type: Mouse, Page: 1, Usage: 2
- Description: Synaptics PS/2 Port TouchPad,Handle: 65609, Type: Mouse, Page: 1, Usage: 2

Le mouvement du stylet ou touché génèrent bien l'event RawDevice_RawInput(...).
Il est d'ailleur tout a fait possible de recupèrer les coordonnées du stylet avec
(MouseData )args.GetRawData(), cependant, ce sont des coordonnées absoluts (contrairement à une souris). Ces coordonnées sont d'ailleurs bien plus précises que la souris. (X allant de 0 à 10000 pr donner une ordre d'idée).

En revanche, les soucis arrivent lorsque que l'on essai de récupérer des infos sur la source des donnée envoyé par l'event RawDevice_RawInput(). Dans le cas d'un mouvement de stylet, le handle est égale à 0, et il est impossible de vérifier la source des données par un GetRawDevice(), cela lance une exeption.

Comment se fait il que le handle est détècté correctement lors de l'initialisation :
ex : Description: Wacom Mouse,Handle: 65615, Type: Mouse, Page: 1, Usage: 2
Et que lors de l'evenement RawDevice_RawInput(), le handle soit 0.

Merci pour ton aide !
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".
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 -
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.
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 -
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