使用时以编程方式弹出 USB 设备

Posted

技术标签:

【中文标题】使用时以编程方式弹出 USB 设备【英文标题】:Programmatically Eject USB Device while it is in use 【发布时间】:2014-12-23 12:21:30 【问题描述】:

如何以编程方式弹出 USB 设备,即使它正在使用中?

场景:

    USB 设备连接到系统。

    我们通过“RegisterDeviceNotification”获得 WM_DEVICECHANGE 消息,通过它我们可以处理 DBT_DEVICEARRIVAL、DBT_DEVICEQUERYREMOVE 等事件。

    现在如果设备正在使用中,如果我们想从资源管理器中弹出它,它会提示“问题弹出USB大容量存储设备”此设备当前正在使用中。关闭可能正在使用该设备的所有程序或窗口,然后重试。”

问题:1:如何在使用中不提示USB弹出?

问题:2:当用户按下从资源管理器中弹出 USB 设备时,我们如何获得通知?

提前致谢:)

【问题讨论】:

【参考方案1】:

嗯,你不能机械地弹出它。那么软件弹出是什么意思呢?这意味着 Windows 将阻止为文件或目录创建任何进一步的句柄。因此,之后移除 U 盘是安全的

现在 U 盘正在使用中是什么意思?这只是意味着有打开的句柄。是否阻止创建任何进一步的句柄并没有什么区别。在手柄打开的情况下取出 U 盘意味着您可能会损坏 U 盘上的内容。

因此,想要在使用时弹出 USB 记忆棒不是问题。这个问题根本没有意义。

请注意,Windows 已经告诉您实际上应该做什么:关闭所有可能正在使用该设备的程序或窗口,然后重试。

问题二同样没有多大意义。当磁盘F: 消失时,为什么要关心细节?毕竟,如果您有理由关心(例如打开文件),Windows 会阻止该操作。

【讨论】:

我有一个应用程序,我在其中注册了 WM_DEVICECHANGE 通知。我从 USB 驱动器打开了一个文件。现在,如果我尝试从资源管理器中弹出 USB,它会显示提示。我的问题是,我可以获得显示资源管理器提示的事件吗?我必须处理那个事件。 除了上述评论:USB 附件后我收到 DBT_DEVICEARRIVAL 通知,现在我从 USB 打开了一个文件,然后尝试弹出 USB 表单资源管理器。如何关闭文件(已打开USB的句柄)避免系统提示“USB is in use........”。 检查你打开文件的方法,它的文档会告诉你如何关闭句柄。例如,CreateFile()fopen() 使用不同的关闭方法。 我从 USB 驱动器中打开了一个文件,即十六进制编辑器。我尝试从资源管理器中弹出 USB,现在以编程方式如何找到“十六进制编辑器”已打开文件以及如何在提示出现“USB 正在使用中......”之前关闭它 考虑以下流程:设备已连接 ->WM_DEVICECHANGE 到达 ->设备正在使用(由任何应用程序打开)->尝试弹出(关闭文件并成功弹出)->默认系统提示( USB 设备正在使用中)........在这个流程中,当我们尝试弹出系统提示时,通常会出现系统提示。我必须以编程方式关闭已打开 USB 并成功弹出 USB 的文件以避免系统提示。在系统提示出现之前是否有任何事件完成上述要求的任务?

以上是关于使用时以编程方式弹出 USB 设备的主要内容,如果未能解决你的问题,请参考以下文章

华为不弹出usb连接设置怎么办?

电脑弹出USB设备时提示该设备正在使用中怎么解决

在 Linux 上弹出 USB 设备

USB设备访问弹出抑制?

如何使用 PowerShell 以编程方式弹出锁定的 HDD eSATA 驱动器?

移动存储设备弹出时提示该设备正在使用怎么办