使用Windows消息检测媒体插入驱动器

时间:2010-03-10 20:01:28

标签: c++ winapi usb removable-drive

我正在使用WM_DEVICECHANGE在新USB驱动器连接到计算机时收到通知。这对于像拇指驱动器这样的设备非常有用,只要设备到达它就可以从中读取文件了。对于像SD卡读卡器这样的设备,它不会,因为当设备连接时,消息会被发送一次,但当用户实际将卡插入设备时,不会发送消息。

是否可以在不使用轮询的情况下检测新媒体插入现有USB设备?

4 个答案:

答案 0 :(得分:8)

几周前我就这么做了。从技术上讲,RegisterDeviceNotification路线是正确的方法,但它需要相当多的工作才能正确。但是,Windows资源管理器已经为您完成了所有艰苦的工作。只需将SHChangeNotifyRegister与SHCNE_DRIVEADD / SHCNE_DRIVEREMOVED / SHCNE_MEDIAINSERTED / SHCNE_MEDIAREMOVED一起使用即可。请注意,此方法取决于Shell硬件检测服务(或其他任何调用),但它比尝试自行重新实现该功能要容易得多。

答案 1 :(得分:2)

在“更改通知观察器示例”中有一个非常好的SHChangeNotifyRegister用法示例。 从以下地址下载:

http://msdn.microsoft.com/en-us/library/dd940348.aspx#downloading

我在我的Qt代码中实现了SHChangeNotifyRegister。

感谢卢克的非常好的答案!

答案 2 :(得分:0)

可能是SD阅读器驱动程序中的错误。 WM_DEVICECHANGE中的描述为“DBT_DEVICEARRIVAL 0x8000已插入设备或介质,现已可用。”

因此,您应该收到媒体插入通知。

您尝试使用RegisterDeviceNotification了吗?默认情况下仅发送一些通知,并且媒体更改可能不是其中之一。

答案 3 :(得分:0)

也许这是设备驱动程序中的一个错误(我当然认为它是),但它们似乎都以相同的方式工作......不是。所以在这一点上,即使微软(可能是最大的开发人员)让你相信它应该以这种方式工作(不适用于我的Windows7微软驱动程序),我认为你不能让任何设备驱动程序devlopers改变他们的设备特性。将SD卡插入USB设备只是不会触发WM_DEVICECHANGE消息。

将SHChangeNotifyRegister用于媒体类型设备。它不需要寄存器devicenotification。您可以通过SHGetPathFromIDList获取驱动器号。使用SHCNE_MEDIAINSERTED和SHCNE_MEDIAREMOVED。

如果您正在寻找硬件设备而不是媒体设备,请使用设备ONDeviceNotify,或者您可以编写自己的设备驱动程序。

请参阅此评论的代码CodeProject - Trapping windows messages