为什么只有一个WM_DEVICECHANGE消息的时候多体积USB装置被删除?
-
05-07-2019 - |
题
我正在写一个应用程序,检测到的时候一定USB大容量存储设备插在,当它被拔出-通过监听 WM_DEVICECHANGE消息.
我也登记了我的申请听 WM_DEVICECHANGE
消息 DBT_DEVTYP_DEVICEINTERFACE
(使用 RegisterDeviceNotification API调)和我两个的 DBT_DEVICEARRIVAL
和 DBT_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_DEVICEINTERFACE
和 DBT_DEVTYP_VOLUME
)是相关的?