2017-01-13 1 views
0

J'ai créé l'application winapi qui utilise d'autres .exe via createprocess pour obtenir/définir des rapports. Et maintenant j'ai besoin d'un moyen de détecter que ce périphérique USB HID a été branché/débranché de l'ordinateur lorsque l'application est en cours d'exécution. La partie la plus difficile est que dans cette application, je sais juste VID et PID et je n'ai pas de poignées à ce périphérique USB HID. est-il un moyen de résoudre ce problème ou d'abord besoin de gérer l'appareil?Détection d'insertion/suppression d'appareil caché usb winapi

Modifier

Si quelqu'un est intéressé pourquoi je en ai besoin. Je veux désactiver/activer les contrôles de mon application quand je branche et débranche l'appareil.

Répondre

2

abord vous doit registre propre fenêtre pour recevoir WM_DEVICECHANGE message avec DBT_DEVICEARRIVAL et DBT_DEVICEREMOVECOMPLETE pour GUID_DEVINTERFACE_USB_DEVICE avec RegisterDeviceNotification - fenêtres ne seront pas envoyer cette notification sans inscription!

case WM_CREATE: 

    DEV_BROADCAST_DEVICEINTERFACE NotificationFilter = { 
     sizeof(DEV_BROADCAST_DEVICEINTERFACE), 
     DBT_DEVTYP_DEVICEINTERFACE, 
     0, 
     GUID_DEVINTERFACE_USB_DEVICE 
    }; 

    if (!(_Handle = RegisterDeviceNotification(hwnd, &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE))) 
    { 
     return -1; 
    } 
    break; 

et désenregistrez sur détruire:

case WM_DESTROY: 
    if (_Handle) UnregisterDeviceNotification(_Handle); 
    break; 

après cela, vous serez recevoir une notification. si

Je sais VID et PID

vous pouvez rechercher L"#VID_????&PID_????#" dans dbcc_name (où il en place? vos vid et pid valeurs réelles)

case WM_DEVICECHANGE: 
    switch (wParam) 
    { 
    case DBT_DEVICEREMOVECOMPLETE: 
    case DBT_DEVICEARRIVAL: 
     { 
      PDEV_BROADCAST_DEVICEINTERFACE p = (PDEV_BROADCAST_DEVICEINTERFACE)lParam; 
      if (p->dbcc_devicetype == DBT_DEVTYP_DEVICEINTERFACE && 
       p->dbcc_classguid == GUID_DEVINTERFACE_USB_DEVICE) 
      { 
       DbgPrint("%S\n", p->dbcc_name); 
       if (wcsstr(p->dbcc_name, L"#VID_****&PID_****#")) 
       { 

        DbgPrint("%s\n", wParam == DBT_DEVICEARRIVAL ? "arrival" : "removal"); 
       } 
      } 
     } 
     break; 
    } 
    break; 
+0

' _Handle' est un symbole réservé en C et C + +, et vous ne devriez pas l'utiliser. Si vous le faites, vous risquez d'entrer en collision avec des symboles définis par l'implémentation du langage. C'est leur espace de noms après tout. – IInspectable

+0

@IInspectable "' _Handle' est un symbole réservé en C et C++ "- hmm, écoute pour la première fois à propos de ce mot-clé. [ici] (https://msdn.microsoft.com/fr-fr/library/2e6a4at9.aspx) et [ici] (http://en.cppreference.com/w/cpp/keyword) il n'est pas répertorié. et le principal - si je serai utilisé mot-clé de la langue réservée - compilateur me donner une erreur (ou avertissement comment minimum), mais 'CL'' 19.00.24210' ne pas me donner cet avertissement. (J'utilise '_Handle' comme membre de classe de fenêtre si c'est le cas) - et c'est toutes les" erreurs "que vous avez trouvées ici? rien de plus ? – RbMm

+0

Un * symbole réservé * et un * mot-clé * sont des choses différentes. Un compilateur n'émettra pas d'erreur ou d'avertissement lors de l'utilisation d'un symbole réservé. C'est quelque chose que vous devez savoir sur [identifiants] (http://en.cppreference.com/w/cpp/language/identifiers). – IInspectable

3

Windows envoie à toutes les fenêtres de niveau supérieur le message WM_DEVICECHANGE lorsque de nouveaux périphériques ou supports deviennent disponibles. Vérifie l'événement DBT_DEVICEARRIVAL au wParam. Avec l'événement DBT_DEVICEARRIVAL, lParam peut être converti en une structure DEV_BROADCAST_HDR. Lorsque cela est fait, vous vérifiez dbch_devicetype de DEV_BROADCAST_HDR, et de convertir lParam à nouveau DEV_BROADCAST_HANDLE ou DEV_BROADCAST_VOLUME si dbch_devicetype est égal à DBT_DEVTYP_HANDLE ou DEV_BROADCAST_VOLUME, je ne suis pas sûr de se rappeler que l'on.

+0

au premier-vous pas informer pour le périphérique USB sans 'RegisterDeviceNotification' avec' GUID_DEVINTERFACE_USB_DEVICE', à la seconde nous avons besoin de 'DEV_BROADCAST_DEVICEINTERFACE' ici – RbMm