首页 > 代码库 > C#.NET U盘插拔监控

C#.NET U盘插拔监控

【1】涉及的知识点

1) windows消息处理函数

?
1
protected override void WndProc(ref Message m)

 

捕获Message的系统硬件改变发出的系统消息

 

2) 硬件信息类

?
1
DriveInfo


【2】核心函数

消息常量:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/// <summary>
/// windows消息常量
/// </summary>
class CWndProMsgConst
{
    public const int WM_DEVICECHANGE = 0x219; // 系统硬件改变发出的系统消息
    public const int DBT_DEVICEARRIVAL = 0x8000;// 设备检测结束,并且可以使用
    public const int DBT_CONFIGCHANGECANCELED = 0x0019;
    public const int DBT_CONFIGCHANGED = 0x0018;
    public const int DBT_CUSTOMEVENT = 0x8006;
    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_DEVICETYPEHANGED = 0x0007;
    public const int DBT_QUERYCHANGSPECIFIC = 0x8005;
    public const int DBT_DEVNODES_CECONFIG = 0x0017;
    public const int DBT_USERDEFINED = 0xFFFF;
}   


扫描函数:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/// <summary>
/// 扫描U口设备
/// </summary>
private void ScanUSBDisk()
{
    _usbdiskList.Clear();
    DriveInfo[] drives = DriveInfo.GetDrives();
 
    foreach (DriveInfo drive in drives)
    {
        if ((drive.DriveType == DriveType.Removable) && !drive.Name.Substring(0, 1).Equals("A"))
        {
            try
            {
                _usbdiskList.Add(drive.Name);
            }
            catch
            {
                MessageBox.Show("当前盘不能正确识别,请重新尝试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
    }
}


消息处理函数:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public void FillData(Form form, Message m, ListBox listbox)
{
    _listbox = listbox;
    _form    = form;
 
    try
    {
        if (m.Msg == CWndProMsgConst.WM_DEVICECHANGE) // 系统硬件改变发出的系统消息
        {
            switch (m.WParam.ToInt32())
            {
                case CWndProMsgConst.WM_DEVICECHANGE:
                    break;
                //设备检测结束,并且可以使用
                case CWndProMsgConst.DBT_DEVICEARRIVAL:
                    {
                        ScanUSBDisk();
                        _listbox.Items.Clear();
                        foreach (string str in _usbdiskList)
                        {
                            _listbox.Items.Add(str);
                        }                               
                    }
                    break;
                // 设备卸载或者拔出
                case CWndProMsgConst.DBT_DEVICEREMOVECOMPLETE:
                    {
                        ScanUSBDisk();
                        _listbox.Items.Clear();
                        foreach (string str in _usbdiskList)
                        {
                            _listbox.Items.Add(str);
                        }
                    }                          
                    break;
                default:
                    break;
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("当前盘不能正确识别,请重新尝试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
}          


完整的CS封装文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.IO;
 
namespace USBMonitor
{
    /// <summary>
    /// USB插拔监控类
    /// </summary>
    public class CUSBMonitor
    {
        private delegate void SetTextCallback(string s);
        private IList<string> _usbdiskList = new List<string>();
        private ListBox _listbox = null;
        private Form    _form  = null;
 
        public CUSBMonitor()
        {
            System.Timers.Timer timer = new System.Timers.Timer(1000);
            timer.Enabled = true;
 
            // 达到间隔时发生
            timer.Elapsed += new System.Timers.ElapsedEventHandler(TimerList);
            timer.AutoReset = false; // 仅在间隔第一次结束后引发一次         
        }
 
        public void FillData(Form form, Message m, ListBox listbox)
        {
            _listbox = listbox;
            _form    = form;
 
            try
            {
                if (m.Msg == CWndProMsgConst.WM_DEVICECHANGE) // 系统硬件改变发出的系统消息
                {
                    switch (m.WParam.ToInt32())
                    {
                        case CWndProMsgConst.WM_DEVICECHANGE:
                            break;
                        //设备检测结束,并且可以使用
                        case CWndProMsgConst.DBT_DEVICEARRIVAL:
                            {
                                ScanUSBDisk();
                                _listbox.Items.Clear();
                                foreach (string str in _usbdiskList)
                                {
                                    _listbox.Items.Add(str);
                                }                               
                            }
                            break;
                        // 设备卸载或者拔出
                        case CWndProMsgConst.DBT_DEVICEREMOVECOMPLETE:
                            {
                                ScanUSBDisk();
                                _listbox.Items.Clear();
                                foreach (string str in _usbdiskList)
                                {
                                    _listbox.Items.Add(str);
                                }
                            }                          
                            break;
                        default:
                            break;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("当前盘不能正确识别,请重新尝试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }          
 
        /// <summary>
        /// 设置USB列表
        /// </summary>
        void TimerList(object sender, System.Timers.ElapsedEventArgs e)
        {
            ScanUSBDisk();
            foreach (string str in _usbdiskList)
            {
                SetText(str);
            }
        }
 
        /// <summary>
        /// 扫描U口设备
        /// </summary>
        private void ScanUSBDisk()
        {
            _usbdiskList.Clear();
            DriveInfo[] drives = DriveInfo.GetDrives();
 
            foreach (DriveInfo drive in drives)
            {
                if ((drive.DriveType == DriveType.Removable) && !drive.Name.Substring(0, 1).Equals("A"))
                {
                    try
                    {
                        _usbdiskList.Add(drive.Name);
                    }
                    catch
                    {
                        MessageBox.Show("当前盘不能正确识别,请重新尝试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
        }
 
        /// <summary>
        /// 设置List列表
        /// </summary>
        /// <param name="text">名称
        public void SetText(string text)
        {
            if (_listbox == null)
                return;
 
            if (this._listbox.InvokeRequired) // 调用方位于创建控件所在的线程以外的线程中
            {
                if (_listbox.Items.Contains(text))
                    return;
 
                SetTextCallback d = new SetTextCallback(SetText);
                _form.Invoke(d, new object[] { text });
            }
            else
            {
                if (_listbox.Items.Contains(text))
                    return;
 
                this._listbox.Items.Add(text);
            }
        }
    }
 
    /// <summary>
    /// windows消息常量
    /// </summary>
    class CWndProMsgConst
    {
        public const int WM_DEVICECHANGE = 0x219; // 系统硬件改变发出的系统消息
        public const int DBT_DEVICEARRIVAL = 0x8000;// 设备检测结束,并且可以使用
        public const int DBT_CONFIGCHANGECANCELED = 0x0019;
        public const int DBT_CONFIGCHANGED = 0x0018;
        public const int DBT_CUSTOMEVENT = 0x8006;
        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_DEVICETYPEHANGED = 0x0007;
        public const int DBT_QUERYCHANGSPECIFIC = 0x8005;
        public const int DBT_DEVNODES_CECONFIG = 0x0017;
        public const int DBT_USERDEFINED = 0xFFFF;
    }   
}
</string></string>


测试窗体(重写消息函数):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace USBMonitor
{
    public partial class Main : Form
    {
        public Main()
        {
            InitializeComponent();
        }
 
        CUSBMonitor usbMonitor = new CUSBMonitor();
 
        protected override void WndProc(ref Message m)
        {
            usbMonitor.FillData(this, m, _listBox);
 
            base.WndProc(ref m);
        }
    }
}

C#.NET U盘插拔监控