来自:Vayi > 馆藏分类
配色: 字号:
【C#.NET】 U盘插拔监控
2015-02-12 | 阅:  转:  |  分享 
  
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);

????????}

????}

}



献花(0)
+1
(本文系Vayi首藏)