C#.NET U盤插拔監控

【1】涉及的知識點html

1) windows消息處理函數java

?
1
protected override void WndProc(ref Message m)

 

捕獲Message的系統硬件改變發出的系統消息windows

 

2) 硬件信息類ide

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


掃描函數:ui

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


消息處理函數:this

?
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封裝文件:spa

?
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);
         }
     }
}
相關文章
相關標籤/搜索