Bonjour � tous,
Comme on me l'a conseill� � la suite d'un sujet que j'ai ouvert (Utilisation de deux souris), j'aurais besoin de renseignements quant au fonctionnement et � l'utilisation de l'objet RawInput sur C++ Builder.
Pour r�expliquer le sujet pour ceux qui ont la flemme de lire l'autre sujet, dans le cadre d'un projet, j'ai besoin de mesurer une vitesse de d�placement d'un chariot, et pour �a j'ai pens� � une solution : utiliser une souris !
Bien entendu, au final cela fait une souris pour la navigation, et une deuxi�me pour les mesures. Cependant comme vous vous en doutez, lors de l'acquisition de donn�es de la souris de mesure (que nous appellerons N2 pour plus de facilit�), le curseur se d�place, comme il le fait lors de l'utilisation de la premi�re souris (N1).
Mon but : Pouvoir mesurer avec N2 sans que le curseur ne soit affect�, et � l'inverse, naviguer avec N1, sans que les mesures ne soient affect�es (des tests avec DirectInput, qui utilise le p�riph�rique "g�n�ral" des souris, ont justement r�v�l�s ce probl�me ...).
J'ai bien vu que c'�tait possible en t�l�chargeant USBMonitor qui est un Sniffer USB, j'ai pu s�lectionner sur quelle souris je souhaitais analyser les donn�es (donc p�riph�riques HID identifiables s�par�ment), et j'ai �galement pu faire ce que je cherche � faire.
J'ai donc d�sactiv� l'une de mes deux souris via le gestionnaire de p�riph�riques (mais sans la d�connecter), et j'ai lanc� l'acquisition de cette m�me souris (N2 donc). Lors des d�placements, le curseur ne bougeait pas (vu que p�riph�rique d�sactiv�), mais le Sniffer recevait tout de m�me les trames de donn�es, tandis que lors des d�placements de N1, le curseur bougeait, mais aucune trame n'�tait analys�e.
En gros, il me faut pouvoir int�grer ces m�mes fonctionnalit�s � mon API (et une fois r�ussi, il me faudra d�coder les trames, qui sont brutes, mais �a c'est un autre probl�me).
Pour ce faire on m'a conseill� d'utiliser RawInput. Le probl�me est que j'ai un mal fou � en comprendre le fonctionnement.
N'�tant qu'en licence professionnelle, je n'ai pas un niveau d'expert, autant DirectInput a �t� assez simple � mettre en �uvre, autant l� j'en chie comme pas permis.
Bref, voici le code que j'ai pour le moment :
Unit1.cpp
Code C++ : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 RAWINPUTDEVICE Rid[1]; HRESULT hResult; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Rid[0].usUsagePage = 1; Rid[0].usUsage = 2; Rid[0].dwFlags = RIDEV_NOLEGACY; // adds HID mouse and also ignores legacy mouse messages Rid[0].hwndTarget = 0; hResult = RegisterRawInputDevices(Rid, 1, sizeof(Rid[0])); Edit1->Text=Rid[0].usUsage; if(hResult==0) ShowMessage("Erreur N°"+GetLastError()); } //--------------------------------------------------------------------------- void __fastcall TForm1::WMInput(TMessage &Message) { UINT dwSize; UCHAR szTempOutput[16]; szTempOutput[0]=0x00; GetRawInputData((HRAWINPUT)Message.LParam, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER)); LPBYTE lpb = new BYTE[dwSize]; if (GetRawInputData((HRAWINPUT)Message.LParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER)) != dwSize ) ShowMessage("GetRawInputData does not return correct size !"); RAWINPUT* raw = (RAWINPUT*)lpb; if (raw->header.dwType == RIM_TYPEMOUSE) { hResult = StringCchPrintf(szTempOutput, STRSAFE_MAX_CCH, TEXT("Mouse: usFlags=%04x ulButtons=%04x usButtonFlags=%04x usButtonData=%04x ulRawButtons=%04x lLastX=%04x lLastY=%04x ulExtraInformation=%04x\r\n"), raw->data.mouse.usFlags, raw->data.mouse.ulButtons, raw->data.mouse.usButtonFlags, raw->data.mouse.usButtonData, raw->data.mouse.ulRawButtons, raw->data.mouse.lLastX, raw->data.mouse.lLastY, raw->data.mouse.ulExtraInformation); if (FAILED(hResult)) ShowMessage("Erreur N°"+GetLastError()); OutputDebugString(szTempOutput); } delete[] lpb; TForm1::WMInput(Message); } //---------------------------------------------------------------------------
Unit1.h
Code C++ : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 #define WM_INPUT 0x00FF //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // Composants gérés par l'EDI TButton *Button1; TEdit *Edit1; TTimer *Timer1; TEdit *Edit2; void __fastcall Button1Click(TObject *Sender); void __fastcall Timer1Timer(TObject *Sender); private: // Déclarations utilisateur public: // Déclarations utilisateur __fastcall TForm1(TComponent* Owner); void __fastcall WMInput(TMessage &Message); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_INPUT, TMessage, WMInput) END_MESSAGE_MAP(TForm) UINT WINAPI GetRegisteredRawInputDevices( __out_opt PRAWINPUTDEVICE pRawInputDevices, __inout PUINT puiNumDevices, __in UINT cbSize ); typedef struct tagRAWINPUTDEVICE { USHORT usUsagePage; USHORT usUsage; DWORD dwFlags; HWND hwndTarget; } RAWINPUTDEVICE, *PRAWINPUTDEVICE, *LPRAWINPUTDEVICE; typedef struct tagRAWINPUT { RAWINPUTHEADER header; union { RAWMOUSE mouse; RAWKEYBOARD keyboard; RAWHID hid; } data; } RAWINPUT, *PRAWINPUT, *LPRAWINPUT; typedef struct tagRAWMOUSE { USHORT usFlags; union { ULONG ulButtons; struct { USHORT usButtonFlags; USHORT usButtonData; }; }; ULONG ulRawButtons; LONG lLastX; LONG lLastY; ULONG ulExtraInformation; } RAWMOUSE, *PRAWMOUSE, *LPRAWMOUSE; };
Du coup je remet le dernier message que j'ai �crit sur l'ancien sujet :
En r�sum� :
J'ai fait pas mal de tests en mode pas � pas, et j'ai bien l'impression que cod� comme je l'ai fait, la fonction n'est jamais appel�e.
La variable "Message" a bien une valeur (qui change souvent d'ailleurs) mais j'arrive pas trop � en savoir davantage, du coup la fonction GetRawInputData n'est jamais appel�e non plus, donc pas de donn�es � analyser.
Malgr� tes explications, j'ai quand m�me un peu de mal � saisir le concept, comment "appara�t" le message WM_INPUT ? Qu'entends-tu par le niveau de priorit� d�fini � mon application ?
Pour ce qu'il me semble avoir compris, le bout de code que tu m'as montr� renvoie le message WM_INPUT vers la fonction d�clar�e juste avant le BEGIN_MESSAGE_MAP d�s r�ception de ce dernier ?
Et est-ce que c'est g�nant que le driver de ma souris essaye de r�cup�rer les m�mes infos que moi (sachant que RawInput est fait pour r�cup�rer les donn�es directement sur le port USB, avant le driver donc si j'ai bien compris) ?
Voil�, alors d�sol� du roman, mais je pr�f�re prendre le temps de bien expliquer les choses, pour vous faciliter la t�che.
Cordialement.
Partager