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

 

posted on 2014-05-16 23:37  IOTer  阅读(655)  评论(0编辑  收藏  举报

导航