我目前正在使用 WM_DEVICECHANGE 在新的 USB 驱动器连接到计算机时收到通知。这对于像拇指驱动器这样的设备非常有用,一旦设备到达,它就可以从中读取文件。对于像 SD 卡读卡器这样的设备,它不会,因为在设备连接时会发送一次消息,但当用户实际将卡插入设备时不会发送消息。
是否可以检测新媒体插入现有 USB 设备而无需使用轮询?
我目前正在使用 WM_DEVICECHANGE 在新的 USB 驱动器连接到计算机时收到通知。这对于像拇指驱动器这样的设备非常有用,一旦设备到达,它就可以从中读取文件。对于像 SD 卡读卡器这样的设备,它不会,因为在设备连接时会发送一次消息,但当用户实际将卡插入设备时不会发送消息。
是否可以检测新媒体插入现有 USB 设备而无需使用轮询?
我几周前才这样做。从技术上讲,RegisterDeviceNotification 路由是正确的方法,但它需要大量的工作才能正确。但是,Windows 资源管理器已经为您完成了所有艰苦的工作。只需将SHChangeNotifyRegister与 SHCNE_DRIVEADD / SHCNE_DRIVEREMOVED / SHCNE_MEDIAINSERTED / SHCNE_MEDIAREMOVED 一起使用。请注意,此方法取决于 Shell 硬件检测服务(或任何名称),但它比尝试自己重新实现功能要容易得多。
SHChangeNotifyRegister
在“Change Notify Watcher Sample”中有一个很好的使用示例。从这个地址下载:
http://msdn.microsoft.com/en-us/library/dd940348.aspx#downloading
我在 Qt 代码中实现了 SHChangeNotifyRegister。
感谢卢克的非常好的回答!
可能是 SD 读卡器驱动程序中的错误。WM_DEVICECHANGE中的描述是“DBT_DEVICEARRIVAL 0x8000 设备或媒体已插入并且现在可用。”
因此,您应该收到有关媒体插入的通知。
您是否尝试使用RegisterDeviceNotification?默认情况下只发送一些通知,媒体更改可能不是其中之一。
也许这是设备驱动程序中的一个错误(我当然认为是),但它们似乎都以相同的方式工作......不是。所以在这一点上,我认为你不能让任何设备驱动程序开发人员改变他们的设备特性,即使微软(可能是最大的开发人员)让你相信它应该以这种方式工作(不适用于我的 Windows7 微软驱动程序)。将 SD 卡插入 USB 设备不会触发 WM_DEVICECHANGE 消息。
对媒体类型设备使用 SHChangeNotifyRegister。它不需要注册设备通知。您可以通过 SHGetPathFromIDList 获取驱动器号。使用 SHCNE_MEDIAINSERTED 和 SHCNE_MEDIAREMOVED。
如果您正在寻找硬件设备而不是媒体设备,请使用设备 ONDeviceNotify,或者您可以编写自己的设备驱动程序。
请参阅此评论的代码CodeProject - 捕获 windows 消息