Frage

Ich bin eine Anwendung schreiben, wenn ein bestimmten USB-Massenspeichergerät erkennt eingesteckt ist, und wenn es unplugged - durch das Hören WM_DEVICECHANGE Nachrichten .

Ich habe registriert auch meine Bewerbung für WM_DEVICECHANGE Nachrichten für DBT_DEVTYP_DEVICEINTERFACE zu hören (die RegisterDeviceNotification API-Aufruf) und ich sowohl die DBT_DEVICEARRIVAL und DBT_DEVICEREMOVECOMPLETE Nachrichten, wenn ein USB-Massenspeichergerät belegt ist oder nicht angeschlossen.

Jetzt das Problem tritt auf, wenn ein USB-Gerät, dass mehrere Volumes hat eingesteckt ist, und dann unplugged.

Ich erhalte die folgenden Meldungen, wenn das Gerät eingesteckt ist:

  • WM_DEVICECHANGE (DBT_DEVICEARRIVAL vom Typ DBT_DEVTYP_DEVICEINTERFACE)
  • WM_DEVICECHANGE (DBT_DEVICEARRIVAL vom Typ DBT_DEVTYP_VOLUME)
  • WM_DEVICECHANGE (DBT_DEVICEARRIVAL vom Typ DBT_DEVTYP_VOLUME)

Und die folgenden Meldungen, wenn es eingesteckt ist aus:

  • WM_DEVICECHANGE (DBT_DEVICEREMOVECOMPLETE vom Typ DBT_DEVTYP_VOLUME)
  • WM_DEVICECHANGE (DBT_DEVICEREMOVECOMPLETE vom Typ DBT_DEVTYP_DEVICEINTERFACE)

So nur eine Nachricht löschen , obwohl es zwei Bände . Warum ??

Ich habe zwei Fragen:

  • Wie kann ich DBT_DEVTYP_DEVICEINTERFACE Nachrichten mit DBT_DEVTYP_VOLUME Nachrichten korreliert (im Wesentlichen, wie kann ich wissen, die VOLUME Nachricht entspricht die DEVICEINTERFACE Nachricht - da ich sie beide für das Gerät )?
  • Gibt es eine Möglichkeit, um Windows zu machen informieren Sie mich über beide Volumen Umzüge?
War es hilfreich?

Lösung

Ok, so konnte ich eine meiner eigenen Fragen beantworten: Gibt es eine Möglichkeit, um Windows zu machen informieren Sie mich über beide Volumen Umzüge

Ja - obwohl Fenster nur ein DBT_DEVTYP_VOLUME WM_DEVICECHANGE Nachricht senden, Sie erhalten tatsächlich beiden Volumen Umzüge benachrichtigen - aber, wie immer, liegt die Antwort tief in MSDN begraben:

  

Obwohl das dbcv_unitmask Mitglied mehr als ein Volume in jeder Nachricht angeben, kann dies nicht garantiert, dass nur eine Nachricht für ein bestimmtes Ereignis generiert wird. Mehrere Systemkomponenten Nachrichten für logische Volumes gleichzeitig unabhängig erzeugen kann.

Also, alles, was ich tun musste, war die Beispielfunktion , dass Microsoft in einer ihrer Proben gibt,

char FirstDriveFromMask (ULONG unitmask)
{
   char i;

   for (i = 0; i < 26; ++i)
   {
      if (unitmask & 0x1)
         break;
      unitmask = unitmask >> 1;
   }

   return (i + 'A');
}

und ersetzen Sie es mit einer Funktion, die die Maske interpretiert für alle Antriebe betroffen. So ist die eine Botschaft, die ich bekam war in der Tat für beide Bände, und beide Volumen Laufwerksbuchstaben waren in der Maske zur Verfügung.

// [IN] ULONG unitmask
// [IN/OUT] char* outDriveLetters  - an array of characters to be passed in
//                                   that is filled out with the drive letters
//                                   in the mask (this must be 26 bytes to be safe)
// RETURNS the number of drive letters in the mask
int MaskToDriveLetters (ULONG unitmask, char* outDriveLetters)
{
   int cnt = 0;
   for (i = 0; i < 26; ++i)
   {
      if (unitmask & 0x1)
      {
         outDriveLetters[cnt++] = 'A' + i;
         cnt++;
      }
      unitmask = unitmask >> 1;
   }

   outDriveLetters[cnt] = 0; // set the last character to \0 (optional)
   return cnt;  // the number of drives that were set in the mask
}

ich noch die andere Frage haben, obwohl zu beantworten - wie können die beiden Nachrichten (DBT_DEVTYP_DEVICEINTERFACE und DBT_DEVTYP_VOLUME) korreliert werden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top