2010-06-16 8 views

Répondre

2

Catch WM_DEVICECHANGE de toute poignée de fenêtre en vous inscrivant pour les notifications de changement d'appareil. En tant que tel:

DEV_BROADCAST_DEVICEINTERFACE dbd = { sizeof(dbd) }; 
dbd.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; 
dbd.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE; 
RegisterDeviceNotification(hwnd, &dbd, DEVICE_NOTIFY_WINDOW_HANDLE); 

Le lParam du WM_DEVICECHANGE peut être jeté à DBT_DEVTYP_DEVICEINTERFACE. Remarque: lorsque vous branchez un périphérique, vous pouvez recevoir plusieurs notifications WM_DEVICECHANGE. Il suffit de filtrer sur l'événement d'arrivée et d'ignorer les doublons.

LRESULT WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(hwnd) 
    { 
     case WM_DEVICE_CHANGE: 
     { 
      PDEV_BROADCAST_HDR pHdr = NULL; 
      PDEV_BROADCAST_DEVICEINTERFACE pDev = NULL; 
      pHdr = (PDEV_BROADCAST_HDR)lParam; 
      bool fDeviceArrival = (wParam == DBT_DEVICEARRIVAL); 
      if (fDeviceArrival) 
      { 
       if (pHdr && (pHdr->dbch_devicetype==DBT_DEVTYP_DEVICEINTERFACE)) 
       { 
        pDev = (PDEV_BROADCAST_DEVICEINTERFACE)lParam; 
       } 
       if (pDev && (pDev->dbcc_classguid == GUID_DEVINTERFACE_USB_DEVICE)) 
       { 
        // the PNP string of the device just plugged is in dbcc_name 
        OutputDebugString(pDev->dbcc_name); 
        OutputDebugString("\r\n"); 
       } 
      } 
     .... 
+0

'' lParam' de WM_DEVICECHANGE', peut ou ne peut pas être jeté à ' DBT_DEVTYP_DEVICEINTERFACE'. Cela dépend de 'wParam'. par exemple. il peut être lancé si wparam est 'DBT_DEVICEARRIVAL', ou' DBT_DEVICEREMOVECOMPLETE', mais pas quand il s'agit de 'DBT_DEVNODES_CHANGED'. Dans le cas de 'DBT_DEVNODES_CHANGED',' 'lParam' est toujours' zéro'. –

1

Je pense que vous pouvez le faire en utilisant WMI. Regardez la classe Win32_LogicalDiskToPartition pour obtenir une liste de tous les noms de disque, puis utiliser ces noms pour interroger la classe Win32_DiskDrive et sa propriété PNPDeviceID.

En fait, regardez here de meilleures instructions et une classe bien que le fait pour vous.

+0

Mais je veux trouver l'identifiant d'instance de périphérique d'un nouveau branché device.At ce moment-là je ne sais pas la lettre de lecteur de cette device.And nouvellement branché si l'utilisateur est branché allready deux ou trois stylo lecteur à le système et maintenant il insère un autre périphérique. – Navaneeth

+0

@Navaneeth: Regardez la classe 'ManagementEventWatcher' et l'événement 'DiskEventArrived'. Ce code devrait vous montrer la structure: http://www.eggheadcafe.com/software/aspnet/31850441/c-usb-pluginremoval-h.aspx –