USB设备插入USB接口之后,windows产生设备消息,发往每一个window消息队列,可以从WndProc中获得USB插入或移除消息:
protected override void WndProc(ref Message sysm) { const int WM_DEVICECHANGE = 0x219; const int DBT_DEVICEARRIVAL = 0x8000; try { if(sysm.Msg==WM_DEVICECHANGE) if (sysm.WParam.ToInt32() == DBT_DEVICEARRIVAL) { string[] dirs = Environment.GetLogicalDrives(); //取得所有的盘符 foreach (string dir in dirs) { DriveInfo Tdriver=new DriveInfo(dir); if(Tdriver.DriveType==DriveType.Removable){ { while (Tdriver.IsReady == false) { Thread.Sleep(500); } try { string PSTR = ""; PSTR += "磁盘名称:" + Tdriver.Name + "\r\n"; PSTR += "磁盘卷标:" + Tdriver.VolumeLabel + "\r\n"; PSTR += "文件系统:" + Tdriver.DriveFormat + "\r\n"; PSTR += "剩余大小:" + Tdriver.AvailableFreeSpace.ToString() + "\r\n"; PSTR += "总体容量:" + Tdriver.TotalSize.ToString() + "\r\n"; MessageBox.Show(PSTR); } catch { MessageBox.Show("error"); } } } } } } catch { } base.WndProc(ref sysm);
通过对dirs的的检测,可以发现哪些是USB盘,用USBPhysic.dll可以读取到USB设备的物理信息:
[DllImport("USBPhysic")] public static extern int Init(string sUser, string sRegCode); [DllImport("USBPhysic")] public static extern int GetUSBPhysicInfo(int diskIndex, int InfoType, StringBuilder pHddInfo);
以上是引用USBPhysic.dll中的两个方法,当然Init方法用来注册USBPhysic.dll,之后可以读取到设备信息:
private void Form1_Load(object sender, EventArgs e) { string Pstr = ""; StringBuilder T = new StringBuilder(); int A = Init("Mndsoft.com", "C88C-7F7A-725B"); Pstr += "磁盘总数:" + A.ToString() + "\r\n"; A = GetUSBPhysicInfo(0, 0, T); Pstr += "磁盘串号:" + T.ToString() + "\r\n"; A = GetUSBPhysicInfo(0, 1, T); Pstr += "磁盘名称:" + T.ToString() + "\r\n"; A = GetUSBPhysicInfo(0, 2, T); Pstr += "磁盘厂商:" + T.ToString() + "\r\n"; MessageBox.Show(Pstr); }
上面默认读取0号磁盘信息,对于一个示例U盘,返回如下: