在我们公司的项目,我们用WM_DEVICECHANGE消息检测的到来,并删除USB设备。应该将与其他几个实用程序运行的机器上运行的应用程序。几个月后,项目交付,客户端报道,有时即使USB设备插入,这是没有检测到。问题的问题... ...
经过一番调查,我们发现,如果我们把窗口一个顶层窗口(HWND_TOPMOST),不存在这样的问题。但是,什么是Z -顺序和上述问题之间的关系。后来,我们得到了数点,以确定的关系。WM_DEVICECHANGE是根据他们的Z -顺序发送到所有的顶层窗口。这是在最上面的位置窗口收到消息的第一,那么只有下面的窗口等。如果一个窗口得到一个WM_DEVICECHANGE,如果在一段时间内没有处理的消息(在我的机器上,我认为这是20秒),该消息不会达到下的后续Windows。
现在一切都变得清楚地告诉我们,一些窗口的Z -顺序大于我们的应用程序窗口可能已经挂起或在20秒内没有处理的消息。因此,我们的窗口没有得到一个机会。此外,当我们提出我们的窗口顶层,这将是其中的第一个窗口的,从而减少窗户的数量,它上面得到红WM_DEVICECHANGE消息。以往我们没有找到一个妥善的解决办法,并转移到一个替代的方法来检测设备到达和清除。
我认为Windows可能不被使用的BroadcastSystemMessage()函数使用的BSF_FORCEIFHUNG标志,同时发送WM_DEVICECHANGE消息。