【问题标题】:how to detect that Windows finished adding/removing storage devices (not as drive letters, only as devices)如何检测 Windows 完成添加/删除存储设备(不是驱动器号,仅作为设备)
【发布时间】:2011-01-15 07:19:36
【问题描述】:

我有一些带有简化 Windows 的计算机,其中添加/删除的存储设备不会自动获得驱动器号。 所以我必须找到一种方法来检测添加/删除的内容。 一种方法(我知道)是使用 WM_DEVICECHANGE 消息。 在这些计算机上,消息仅使用 WParam 7 和 LParam 0 发送到 Windows。 因此,当我的应用程序收到此消息时,我可以运行我的检测代码。 问题是设备需要一些时间才能被完全识别;同时,我的应用程序被 WM_DEVICECHANGE 消息的“齐射”“轰炸”,检测代码甚至启动了 6..7 次。 为了解决这个问题,我可以添加一个由新消息重新初始化的计时器;如果在一段时间(1..2 秒)后,应用程序没有收到消息,则启动检测代码。 但我不是 100% 喜欢这种方法,因为它没有考虑其他因素,例如:计算机的速度、其他减慢 Windows 的程序、不同的存储设备类型等。以及检测代码在之后完成的事实延迟有点烦人。

有没有人知道更专业的解决方案...?

感谢您的帮助。

【问题讨论】:

  • 我还没有做过类似的事情,但是看看 shell 事件,当文件被删除、更改、修改等时,使用 shell 还可以通知您(仅一次/操作)。我如果您不熟悉语法 (VC) 或从 C# 到 Delphi 的等价物,请确保您可以在 msdn 上找到有用的东西,然后请人们将代码转换为 Delphi。
  • @Dorin,好的,我知道我可以查看和搜索,但我已经这样做了,但一无所获,我来这里寻求帮助...

标签: windows delphi storage device


【解决方案1】:

我昨天正在处理这些消息,在我的测试程序中,如果我过滤消息,我只会收到一条用于添加的消息和一条用于删除的消息。

请查看我的blog 以获得更详细的说明。

【讨论】:

  • 我看了你的博客。我的问题是在消息(WParam)中我没有 DEV_BROADCAST_HDR 结构,只有数字“7”。有没有其他方法可以过滤这些消息...?
  • @John Mirror:它们在 Jedi Apilib 中定义blog.delphi-jedi.net/jedi-api-headers
【解决方案2】:

的确,在大多数情况下,您会收到大量消息。我对此的解决方案与您的解决方案相似,只是我使用线程而不是计时器。在这种情况下,我的等待时间是 15 秒(在 DBT_DEVICEARRIVAL 之后)。

事实上,当我查看您问题的措辞时,DBT_DEVICEARRIVAL 正是您正在寻找的那个。 设备在那个时候是可用的,即使有更多的通知。插入 USB 密钥时,我得到以下信息:

  • DBT_DEVNODES_CHANGED
  • DBT_DEVNODES_CHANGED
  • DBT_DEVNODES_CHANGED
  • DBT_DEVICEARRIVAL(DBT_DEVTYP_VOLUME,驱动器号已提供)
  • DBT_DEVNODES_CHANGED
  • DBT_DEVNODES_CHANGED
  • DBT_DEVNODES_CHANGED

对于您的目的,DBT_DEVNODES_CHANGED 通知是无关紧要的。您只对 DBT_DEVICEARRIVAL 感兴趣(用 Delphi 的说法是 8000 美元)。

此外,如果您通过消息的符号名称而不是其编号来引用消息,这将非常有帮助。

【讨论】:

    猜你喜欢
    • 2016-08-19
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2015-07-19
    • 2011-12-18
    • 1970-01-01
    相关资源
    最近更新 更多