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 :

Citation Envoy� par minnesota Voir le message
Le message est envoy� par le syst�me d'exploitation � ton application quand il le d�cide, du moins quand un contenu est disponible, en fonction de la priorit� que tu as d�finie pour cette m�me application. Faut voir �a comme un t�l�gramme qui transitera par la fonction que tu as d�fini, que tu pourras intercepter et analyser. N'h�site pas � exp�rimenter le programme que je t'ai donn� en lien, tu pourras constater par toi m�me l'ampleur de ce syst�me de communication dans ce syst�me d'exploitation. Pour approfondir le sujet, il te suffit de faire une recherche sur "programmation Windows".
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.