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;
}
}
}