C#.NETU盘插拔监控
【1】涉及的知识点
1)windows消息处理函数
?
1 protectedoverridevoidWndProc(refMessagem)
捕获Message的系统硬件改变发出的系统消息
2)硬件信息类
?
1 DriveInfo 【2】核心函数
消息常量:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 ///
///windows消息常量
///
classCWndProMsgConst
{
????publicconstintWM_DEVICECHANGE=0x219;//系统硬件改变发出的系统消息
????publicconstintDBT_DEVICEARRIVAL=0x8000;//设备检测结束,并且可以使用
????publicconstintDBT_CONFIGCHANGECANCELED=0x0019;
????publicconstintDBT_CONFIGCHANGED=0x0018;
????publicconstintDBT_CUSTOMEVENT=0x8006;
????publicconstintDBT_DEVICEQUERYREMOVE=0x8001;
????publicconstintDBT_DEVICEQUERYREMOVEFAILED=0x8002;
????publicconstintDBT_DEVICEREMOVECOMPLETE=0x8004;//设备卸载或者拔出
????publicconstintDBT_DEVICEREMOVEPENDING=0x8003;
????publicconstintDBT_DEVICETYPEHANGED=0x0007;
????publicconstintDBT_QUERYCHANGSPECIFIC=0x8005;
????publicconstintDBT_DEVNODES_CECONFIG=0x0017;
????publicconstintDBT_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 ///
///扫描U口设备
///
privatevoidScanUSBDisk()
{
????_usbdiskList.Clear();
????DriveInfo[]drives=DriveInfo.GetDrives();
?
????foreach(DriveInfodriveindrives)
????{
????????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 publicvoidFillData(Formform,Messagem,ListBoxlistbox)
{
????_listbox=listbox;
????_form???=form;
?
????try
????{
????????if(m.Msg==CWndProMsgConst.WM_DEVICECHANGE)//系统硬件改变发出的系统消息
????????{
????????????switch(m.WParam.ToInt32())
????????????{
????????????????caseCWndProMsgConst.WM_DEVICECHANGE:
????????????????????break;
????????????????//设备检测结束,并且可以使用
????????????????caseCWndProMsgConst.DBT_DEVICEARRIVAL:
????????????????????{
????????????????????????ScanUSBDisk();
????????????????????????_listbox.Items.Clear();
????????????????????????foreach(stringstrin_usbdiskList)
????????????????????????{
????????????????????????????_listbox.Items.Add(str);
????????????????????????}???????????????????????????????
????????????????????}
????????????????????break;
????????????????//设备卸载或者拔出
????????????????caseCWndProMsgConst.DBT_DEVICEREMOVECOMPLETE:
????????????????????{
????????????????????????ScanUSBDisk();
????????????????????????_listbox.Items.Clear();
????????????????????????foreach(stringstrin_usbdiskList)
????????????????????????{
????????????????????????????_listbox.Items.Add(str);
????????????????????????}
????????????????????}??????????????????????????
????????????????????break;
????????????????default:
????????????????????break;
????????????}
????????}
????}
????catch(Exceptionex)
????{
????????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 usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Threading;
usingSystem.IO;
?
namespaceUSBMonitor
{
????///
????///USB插拔监控类
????///
????publicclassCUSBMonitor
????{
????????privatedelegatevoidSetTextCallback(strings);
????????privateIList_usbdiskList=newList();
????????privateListBox_listbox=null;
????????privateForm???_form?=null;
?
????????publicCUSBMonitor()
????????{
????????????System.Timers.Timertimer=newSystem.Timers.Timer(1000);
????????????timer.Enabled=true;
?
????????????//达到间隔时发生
????????????timer.Elapsed+=newSystem.Timers.ElapsedEventHandler(TimerList);
????????????timer.AutoReset=false;//仅在间隔第一次结束后引发一次?????????
????????}
?
????????publicvoidFillData(Formform,Messagem,ListBoxlistbox)
????????{
????????????_listbox=listbox;
????????????_form???=form;
?
????????????try
????????????{
????????????????if(m.Msg==CWndProMsgConst.WM_DEVICECHANGE)//系统硬件改变发出的系统消息
????????????????{
????????????????????switch(m.WParam.ToInt32())
????????????????????{
????????????????????????caseCWndProMsgConst.WM_DEVICECHANGE:
????????????????????????????break;
????????????????????????//设备检测结束,并且可以使用
????????????????????????caseCWndProMsgConst.DBT_DEVICEARRIVAL:
????????????????????????????{
????????????????????????????????ScanUSBDisk();
????????????????????????????????_listbox.Items.Clear();
????????????????????????????????foreach(stringstrin_usbdiskList)
????????????????????????????????{
????????????????????????????????????_listbox.Items.Add(str);
????????????????????????????????}???????????????????????????????
????????????????????????????}
????????????????????????????break;
????????????????????????//设备卸载或者拔出
????????????????????????caseCWndProMsgConst.DBT_DEVICEREMOVECOMPLETE:
????????????????????????????{
????????????????????????????????ScanUSBDisk();
????????????????????????????????_listbox.Items.Clear();
????????????????????????????????foreach(stringstrin_usbdiskList)
????????????????????????????????{
????????????????????????????????????_listbox.Items.Add(str);
????????????????????????????????}
????????????????????????????}??????????????????????????
????????????????????????????break;
????????????????????????default:
????????????????????????????break;
????????????????????}
????????????????}
????????????}
????????????catch(Exceptionex)
????????????{
????????????????MessageBox.Show("当前盘不能正确识别,请重新尝试!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
????????????}
????????}??????????
?
????????///
????????///设置USB列表
????????///
????????voidTimerList(objectsender,System.Timers.ElapsedEventArgse)
????????{
????????????ScanUSBDisk();
????????????foreach(stringstrin_usbdiskList)
????????????{
????????????????SetText(str);
????????????}
????????}
?
????????///
????????///扫描U口设备
????????///
????????privatevoidScanUSBDisk()
????????{
????????????_usbdiskList.Clear();
????????????DriveInfo[]drives=DriveInfo.GetDrives();
?
????????????foreach(DriveInfodriveindrives)
????????????{
????????????????if((drive.DriveType==DriveType.Removable)&&!drive.Name.Substring(0,1).Equals("A"))
????????????????{
????????????????????try
????????????????????{
????????????????????????_usbdiskList.Add(drive.Name);
????????????????????}
????????????????????catch
????????????????????{
????????????????????????MessageBox.Show("当前盘不能正确识别,请重新尝试!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
????????????????????}
????????????????}
????????????}
????????}
?
????????///
????????///设置List列表
????????///
????????///名称
????????publicvoidSetText(stringtext)
????????{
????????????if(_listbox==null)
????????????????return;
?
????????????if(this._listbox.InvokeRequired)//调用方位于创建控件所在的线程以外的线程中
????????????{
????????????????if(_listbox.Items.Contains(text))
????????????????????return;
?
????????????????SetTextCallbackd=newSetTextCallback(SetText);
????????????????_form.Invoke(d,newobject[]{text});
????????????}
????????????else
????????????{
????????????????if(_listbox.Items.Contains(text))
????????????????????return;
?
????????????????this._listbox.Items.Add(text);
????????????}
????????}
????}
?
????///
????///windows消息常量
????///
????classCWndProMsgConst
????{
????????publicconstintWM_DEVICECHANGE=0x219;//系统硬件改变发出的系统消息
????????publicconstintDBT_DEVICEARRIVAL=0x8000;//设备检测结束,并且可以使用
????????publicconstintDBT_CONFIGCHANGECANCELED=0x0019;
????????publicconstintDBT_CONFIGCHANGED=0x0018;
????????publicconstintDBT_CUSTOMEVENT=0x8006;
????????publicconstintDBT_DEVICEQUERYREMOVE=0x8001;
????????publicconstintDBT_DEVICEQUERYREMOVEFAILED=0x8002;
????????publicconstintDBT_DEVICEREMOVECOMPLETE=0x8004;//设备卸载或者拔出
????????publicconstintDBT_DEVICEREMOVEPENDING=0x8003;
????????publicconstintDBT_DEVICETYPEHANGED=0x0007;
????????publicconstintDBT_QUERYCHANGSPECIFIC=0x8005;
????????publicconstintDBT_DEVNODES_CECONFIG=0x0017;
????????publicconstintDBT_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
24
25
26
27
28 usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
?
namespaceUSBMonitor
{
????publicpartialclassMain:Form
????{
????????publicMain()
????????{
????????????InitializeComponent();
????????}
?
????????CUSBMonitorusbMonitor=newCUSBMonitor();
?
????????protectedoverridevoidWndProc(refMessagem)
????????{
????????????usbMonitor.FillData(this,m,_listBox);
?
????????????base.WndProc(refm);
????????}
????}
}
|
|