Bonjour,

Je développe actuellement une application console Win32 afin de gérer un périphérique USB HID (le SpacePoint Fusion, si cela parle à certains d'entre vous). J'utilise pour cela le WDK et notamment les libs hidsdi et setupapi.
Actuellement, je parviens à trouver mon device, à l'ouvrir et à récupérer ses données sans aucun problème, en utilisant le VendorID et le ProductID fournis.

Mon problème se situe par rapport à la fonction RegisterDeviceNotification, qui permet de s'abonner aux évènements liés au périphérique en question, par ex. connexion/déconnexion USB.
Le 1er paramètre de cette fonction est le handle de la fenêtre qui doit recevoir les messages liés à ces évènements.
Or, dans mon application Win32, le fait de lui passer le handle de ma fenêtre console ne semble pas lui plaire. Si je teste le retour de la fonction énoncée un peu plus haut, l'enregistrement des notifications s'est bien passé. Voici le code de ma fonction :
Code : 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
void RegisterForDeviceNotifications()
{
  // Request to receive messages when a device is attached or removed
  DEV_BROADCAST_DEVICEINTERFACE DevBroadcastDeviceInterface;
  HDEVNOTIFY DeviceNotificationHandle;
 
  ZeroMemory(&DevBroadcastDeviceInterface, sizeof(DevBroadcastDeviceInterface));
  DevBroadcastDeviceInterface.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
  DevBroadcastDeviceInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
  DevBroadcastDeviceInterface.dbcc_classguid = HidGuid;
  DeviceNotificationHandle = RegisterDeviceNotification(GetConsoleWindow(), &DevBroadcastDeviceInterface, DEVICE_NOTIFY_WINDOW_HANDLE);
 
  // Check device notification registration
  if (!DeviceNotificationHandle)
    printf(">>> Device notification registration FAILED.\n");
  else
    printf(">>> Device notification registration SUCCESSFULL.\n");
}
Afin de réceptionner les messages liés aux évènements, j'ai ensuite déclaré les fonctions OnDeviceChange et WindowProc comme suit :
Code : 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
// Handle device notifications: Prototype for the function that handles the processing of WM_DEVICECHANGE messages.
LRESULT OnDeviceChange(WPARAM wParam, LPARAM lParam);
 
// The application's message processing function for the window that receives the WM_DEVICECHANGE messages.
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  printf(">>> Call \"WindowProc\".\n");
  switch (uMsg)
  {
    // Device change message
    case WM_DEVICECHANGE:
      printf("On device change\n");
      OnDeviceChange(wParam, lParam);
      break;
 
    // Catchall for all messages that are
    // not handled by the application.
    default:
      printf("On default\n");
      return DefWindowProc(hWnd, uMsg, wParam, lParam);
  }
  return 0;
}
 
LRESULT OnDeviceChange(WPARAM wParam, LPARAM lParam)  
{
  printf(">>> Call \"On Device Change\".\n");
	PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
	switch(wParam)
	{
		// Find out if a device has been attached or removed
		// If yes, see if the name matches the device path name of the device we want to access
 
		case DBT_DEVICEARRIVAL:
			printf("A device has been attached.\n");
			return TRUE; 
 
		case DBT_DEVICEREMOVECOMPLETE:
			printf("A device has been removed.");
			return TRUE; 
 
		default:
			return TRUE; 
	} 
}
Mais je ne rentre jamais dans WindowProc, donc je soupçonne mon appel àRegisterDeviceNotification d'être incorrect. Peut-être que la fenêtre console ne peut recevoir de messages, et donc que le handle passé en paramètre n'est pas le bon ?

Merci par avance de vos éventuelles suggestions.