USB设备的插入和弹出的监听以及软弹出可移动媒体(如Windows的移除USB设备)

一、监听USB设备的插入和弹出

当USB设备插入或者弹出时,Windows会产生一条全局消息:WM_DEVICECHANGE

我们需要做的是,获得这条消息的wParam参数,如果为DBT_DEVICEARRIVAL则表示有设备插入并可用,

如果是DBT_DEVICEREMOVECOMPLETE则表示有设备已经移除。再查看lParam参数为DBT_DEVTYP_VOLUME时,

就可以取出DEV_BROADCAST_VOLUME结构的卷号dbcv_unitmask,就知道是哪个卷被插入或者弹出。

代码片段如下:

现在,你可以在你的UI线程上创建一个DriveDetector对象,监听DeviceArrived和DeviceRemoved事件。

然后通过该对象WndProc方法,传递UI线程上的消息。WPF程序可以直接用HwndSource对象AddHook,此方法的签名

与HwndSourceHook委托相同。WinForm程序也没关系,override窗口的void WndProc(ref Message m)方法,按

DriveDetector对象的WndProc签名格式,将m数据传入,或者干脆自己写个WinForm版本的。

我的演示代码效果图如下:(注,上述代码未提供显示代码,请自己编写)

USB设备的插入和弹出的监听以及软弹出可移动媒体(如Windows的移除USB设备)_第1张图片

另外,关于磁盘容量的监视可以使用FileSystemWatcher对象。

请参考:http://msdn.microsoft.com/zh-cn/library/cc437966.aspx

摘取代码如下:

二、软件弹出可移动媒体

网上有一部分关于这方法的代码,我的代码是从MSDN获取的VC++版本,需要调用多个API函数,转换为C#代码如下:

参考:http://support.microsoft.com/kb/165721

预览:(注,弹出可移动磁盘,并不会删除驱动器号,但设备已经被弹出,如图中的h盘

注:已改进,安全弹出后,通过DDD_REMOVE_DEFINITION移除h盘。

USB设备的插入和弹出的监听以及软弹出可移动媒体(如Windows的移除USB设备)_第2张图片

你可能感兴趣的:(windows,Microsoft,Access,WPF,WinForm)