【问题标题】:Detect insertion of media into a drive using windows messages使用 Windows 消息检测将媒体插入驱动器
【发布时间】:2011-01-26 01:57:56
【问题描述】:

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

是否可以检测新媒体插入现有 USB 设备而无需使用轮询?

【问题讨论】:

  • @Kirill:问题没有可接受的答案是有充分理由的。他们无法区分“新驱动器”和“在现有驱动器中插入卷”。

标签: c++ winapi usb removable-storage


【解决方案1】:

我几周前才这样做。从技术上讲,RegisterDeviceNotification 路由是正确的方法,但它需要大量的工作才能正确。但是,Windows 资源管理器已经为您完成了所有繁重的工作。只需将SHChangeNotifyRegister 与 SHCNE_DRIVEADD / SHCNE_DRIVEREMOVED / SHCNE_MEDIAINSERTED / SHCNE_MEDIAREMOVED 一起使用。请注意,此方法依赖于 Shell 硬件检测服务(或其他任何名称),但它比尝试自己重新实现功能要容易得多。

【讨论】:

  • 好电话。实现它的库存在于每个系统上。但是 DisableAutorunDriveType 注册表设置会影响吗?
  • 我没有对此进行测试,但我认为这两者没有关联。 “安全删除硬件”托盘应用程序使用此机制;即使禁用了自动运行,该托盘应用仍然需要接收到达/移除通知。
  • 即使 DriveTypeAutoRun 注册表设置被设置为禁用所有设备,仍会发送 SHCNE_MEDIAINSERTED 消息。
【解决方案2】:

在“Change Notify Watcher Sample”中有一个很好的SHChangeNotifyRegister 用法示例。 从这个地址下载:

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

我在 Qt 代码中实现了 SHChangeNotifyRegister。

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

【讨论】:

  • 我还是个新手——谈到将 Windows 代码(像 SHChangeNotifyRegister 之类的东西)与 Qt 代码混合和实现时。你能给我一些指导如何进行吗?任何帮助表示赞赏!
【解决方案3】:

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

因此,您应该会收到有关媒体插入的通知。

您是否尝试过使用RegisterDeviceNotification?默认情况下只发送一些通知,媒体更改可能不是其中之一。

【讨论】:

  • 碰巧的是,默认情况下会发送新的音量通知。
  • 正确,但是插入读卡器时会分配驱动器号(卷)。媒体更改通知可能需要 RegisterDeviceNotification。
【解决方案4】:

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

对媒体类型设备使用 SHChangeNotifyRegister。它不需要注册设备通知。您可以通过 SHGetPathFromIDList 获取驱动器号。使用 SHCNE_MEDIAINSERTED 和 SHCNE_MEDIAREMOVED。

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

查看此评论的代码CodeProject - Trapping windows messages

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多