我正在写一个应用程序,检测到的时候一定USB大容量存储设备插在,当它被拔出-通过监听 WM_DEVICECHANGE消息.

我也登记了我的申请听 WM_DEVICECHANGE 消息 DBT_DEVTYP_DEVICEINTERFACE (使用 RegisterDeviceNotification API调)和我两个的 DBT_DEVICEARRIVALDBT_DEVICEREMOVECOMPLETE 消息时USB量存储设备插入或拔出。

现在, 的问题 发生在一个USB装置, 有多个卷 插入,然后拔出。

我得到以下消息时的设备插入:

  • WM_DEVICECHANGE (DBT_DEVICEARRIVAL 的类型 DBT_DEVTYP_DEVICEINTERFACE)
  • WM_DEVICECHANGE (DBT_DEVICEARRIVAL 的类型 DBT_DEVTYP_VOLUME)
  • WM_DEVICECHANGE (DBT_DEVICEARRIVAL 的类型 DBT_DEVTYP_VOLUME)

和下面的消息时是否插入:

  • WM_DEVICECHANGE (DBT_DEVICEREMOVECOMPLETE 的类型 DBT_DEVTYP_VOLUME)
  • WM_DEVICECHANGE (DBT_DEVICEREMOVECOMPLETE 的类型 DBT_DEVTYP_DEVICEINTERFACE)

所以, 只有一个除消息 即使有 两卷.为什么?

我有两个问题:

  • 我怎么关联 DBT_DEVTYP_DEVICEINTERFACE 消息 DBT_DEVTYP_VOLUME 消息(基本上,我怎么知道哪 信息相当于其中 DEVICEINTERFACE 消息-因为我得到他们两个的设备)?
  • 是否有办法使Windows通知我的两卷清除量?
有帮助吗?

解决方案

好的所以我能回答我自己的一个问题: 是否有办法使Windows通知我的两卷清除量?

是的 -即使windows只发送一个 DBT_DEVTYP_VOLUME WM_DEVICECHANGE 消息, 您实际上做得到通知的数量清除量 -但是,一如既往, 答案在于深深埋在MSDN:

虽然dbcv_unitmask成员可指定多于一个容积的任何消息,这并不能保证,只有一个消息的是产生一个指定的活动。多个系统部件可以独立地产生的消息逻辑卷在同一时间。

那么,我所要做的就是忽略 例功能 Microsoft提供在他们的一个样品,

char FirstDriveFromMask (ULONG unitmask)
{
   char i;

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

   return (i + 'A');
}

并将其替换函,解释了面罩 所有 驱动受到影响。所以一个消息我得到确实是用于这两卷,这两卷的驱动的信件是可用的面罩。

// [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
}

我还有其他问题的答案虽然-如何可以在两个消息(DBT_DEVTYP_DEVICEINTERFACEDBT_DEVTYP_VOLUME)是相关的?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top