C#检测U盘拔插
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Runtime.InteropServices; namespace Usb通讯编程 { public partial class Form1 : Form { public const int WM_DEVICECHANGE = 0x219; //U盘插入后,OS的底层会自动检测到,然后向应用程序发送“硬件设备状态改变“的消息 public const int DBT_DEVICEARRIVAL = 0x8000; //就是用来表示U盘可用的。一个设备或媒体已被插入一块,现在可用。 public const int DBT_CONFIGCHANGECANCELED = 0x0019; //要求更改当前的配置(或取消停靠码头)已被取消。 public const int DBT_CONFIGCHANGED = 0x0018; //当前的配置发生了变化,由于码头或取消固定。 public const int DBT_CUSTOMEVENT = 0x8006; //自定义的事件发生。 的Windows NT 4.0和Windows 95:此值不支持。 public const int DBT_DEVICEQUERYREMOVE = 0x8001; //审批要求删除一个设备或媒体作品。任何应用程序也不能否认这一要求,并取消删除。 public const int DBT_DEVICEQUERYREMOVEFAILED = 0x8002; //请求删除一个设备或媒体片已被取消。 public const int DBT_DEVICEREMOVECOMPLETE = 0x8004; //一个设备或媒体片已被删除。 public const int DBT_DEVICEREMOVEPENDING = 0x8003; //一个设备或媒体一块即将被删除。不能否认的。 public const int DBT_DEVICETYPESPECIFIC = 0x8005; //一个设备特定事件发生。 public const int DBT_DEVNODES_CHANGED = 0x0007; //一种设备已被添加到或从系统中删除。 public const int DBT_QUERYCHANGECONFIG = 0x0017; //许可是要求改变目前的配置(码头或取消固定)。 public const int DBT_USERDEFINED = 0xFFFF; //此消息的含义是用户定义的 public const int DBT_DEVTYP_VOLUME = 0x00000002; [StructLayout(LayoutKind.Sequential)] public struct DEV_BROADCAST_VOLUME { public int dbcv_size; public int dbcv_devicetype; public int dbcv_reserved; public int dbcv_unitmask; } public Form1() { InitializeComponent(); } protected override void WndProc(ref Message m) { try { if (m.Msg == WM_DEVICECHANGE) { switch (m.WParam.ToInt32()) { case WM_DEVICECHANGE: break; case DBT_DEVICEARRIVAL://U盘插入 DriveInfo[] s = DriveInfo.GetDrives(); foreach (DriveInfo drive in s) { if (drive.DriveType == DriveType.Removable && drive.IsReady) { listBox1.Items.Add("U盘已插入,盘符为:" + drive.Name.ToString()); } } break; case DBT_CONFIGCHANGECANCELED: break; case DBT_CONFIGCHANGED: break; case DBT_CUSTOMEVENT: break; case DBT_DEVICEQUERYREMOVE: break; case DBT_DEVICEQUERYREMOVEFAILED: break; case DBT_DEVICEREMOVECOMPLETE: //U盘卸载 int devType = Marshal.ReadInt32(m.LParam, 4); if (devType == DBT_DEVTYP_VOLUME) { DEV_BROADCAST_VOLUME vol; vol = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME)); string ID = vol.dbcv_unitmask.ToString("x"); listBox1.Items.Add("U盘已拔出,盘符为:" + IO(ID)); } break; case DBT_DEVICEREMOVEPENDING: break; case DBT_DEVICETYPESPECIFIC: break; case DBT_DEVNODES_CHANGED: break; case DBT_QUERYCHANGECONFIG: break; case DBT_USERDEFINED: break; default: break; } } } catch (Exception ex) { MessageBox.Show(ex.Message); } base.WndProc(ref m); } public string IO(string ff) { string Value = ""; switch (ff) { case "1": Value = "A:\\"; break; case "2": Value = "B:\\"; break; case "4": Value = "C:\\"; break; case "8": Value = "D:\\"; break; case "10": Value = "E:\\"; break; case "20": Value = "F:\\"; break; case "40": Value = "G:\\"; break; case "80": Value = "H:\\"; break; case "100": Value = "I:\\"; break; case "200": Value = "J:\\"; break; case "400": Value = "K:\\"; break; case "800": Value = "L:\\"; break; case "1000": Value = "M:\\"; break; case "2000": Value = "N:\\"; break; case "4000": Value = "O:\\"; break; case "8000": Value = "P:\\"; break; case "10000": Value = "Q:\\"; break; case "20000": Value = "R:\\"; break; case "40000": Value = "S:\\"; break; case "80000": Value = "T:\\"; break; case "100000": Value = "U:\\"; break; case "200000": Value = "V:\\"; break; case "400000": Value = "W:\\"; break; case "800000": Value = "X:\\"; break; case "1000000": Value = "Y:\\"; break; case "2000000": Value = "Z:\\"; break; default: break; } return Value; } } }