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盘插拔监控的更多相关文章
- 如何在Windows服务程序中添加U盘插拔的消息
研究了下这个问题,主要要在一般的windows服务程序中修改两个地方: 一.调用RegisterServiceCtrlHandlerEx VOID WINAPI SvcMain( DWORD dwAr ...
- android6.0 外部存储设备插拔广播以及获取路径(U盘)【转】
本文转载自:https://blog.csdn.net/zhouchengxi/article/details/53982222 这里我将U盘作为例子来说明解析. android4.1版本时U盘插拔时 ...
- QTC++监控USB插拔
#if defined(Q_OS_WIN) #include <qt_windows.h> #include <QtCore/qglobal.h> #include <d ...
- ARM上的linux如何实现无线网卡的冷插拔和热插拔
ARM上的linux如何实现无线网卡的冷插拔和热插拔 fulinux 凌云实验室 1. 冷插拔 如果在系统上电之前就将RT2070/RT3070芯片的无线网卡(以下简称wlan)插上,即冷插拔.我们通 ...
- 增加 addDataScheme("file") 才能收到SD卡插拔事件的原因分析 -- 浅析android事件过滤策略
http://blog.csdn.net/silenceburn/article/details/6083375 =========================================== ...
- 某天U盘插在笔记本打不开了,是U盘坏了还是电脑的问题?
五六月份忙着毕业设计与毕业论文,U盘在这个时候就是大功臣啦! 然而打印完最终版本论文上交后,再次把U盘插在自己的笔记本上读取失败了... 只有一个空白的图标,打不开,也无法格式化. 试着删除,拔了又插 ...
- Oracle可插拔数据库的jdbc连接串写法
我在服务器上部署某个第三方系统的数据库的时候,服务器数据库版本为oracle 12c.我采用的方式是新建了一个实例.访问正常. 后来项目的负责人告诉我,oracle12C支持所谓的可插拔数据库.可插拔 ...
- 笔记本u盘插上不显示
u盘突然拔出笔记本再次插入时不显示: 解决方法:我的电脑-设备管理器-其他设备(你的U盘驱动)-卸载 再重新插上去,即可显示
- kafka可插拔增强如何实现?
导弹拦截,精准防御. 背景 拦截器:在不修改应用程序业务逻辑的情况下,一组基于事件的可插拔的逻辑处理链: 类比springMVC的拦截器: 这些都是通过配置拦截器,插入到应用程序中,实现可插拔的修改业 ...
随机推荐
- 如何利用OpenCV自带的级联分类器训练程序训练分类器
介绍 使用级联分类器工作包括两个阶段:训练和检测. 检测部分在OpenCVobjdetect 模块的文档中有介绍,在那个文档中给出了一些级联分类器的基本介绍.当前的指南描述了如何训练分类器:准备训练数 ...
- 使用parseJSON代替eval
有些程序员如果没有很好的在javascript中解析json数据,往往会直接eval把json转成js对象,这时候如果json的数据中包含了被注入的恶意数据,则可能导致代码注入的问题. 正确的做法是分 ...
- 对于Oracle中分页排序查询语句执行效率的比较分析
转自:http://bbs.csdn.net/topics/370033478 对于Oracle中分页排序查询语句执行效率的比较分析 作者:lzgame 在工作中我们经常遇到需要在Oracle中进行分 ...
- cocos2d-x入门笔记(1)
cocos2d-x的大致开发流程是,首先使用win32版进行代码编写并完成游戏,然后将代码迁移到对应的开发环境上进行交叉编译完成游戏打包,如iphone上是mac+xcode,android是ecli ...
- mysql存储过程 OUT or INOUT argument 3 for routine
mysql存储过程出现: OUT or INOUT argument 3 for routine gotask.UserLogin is not a variable or NEW pseudo-va ...
- arm-none-eabi-gcc,makefile,stm官方库构建stm32f4xx工程
参考文章:http://www.stmcu.org/module/forum/forum.php?mod=viewthread&tid=603753&highlight=ubuntu ...
- Fixing:insert_modules not found
搞linux的最怕的就是panic.满屏的报错不知头绪,百度出来的还都是抄来抄去的垃圾. 我遇到的错误已经解决,所以不想再看到报错了..google出来两个没有上下文的文本,因为和他们差不多,在下面贴 ...
- 平常写css网页制作时最实用的九条CSS技巧
一.使用css缩写 使用缩写可以帮助减少你CSS文件的大小,更加容易阅读.css缩写的主要规则请参看<css基本语法>. 二.明确定义单位,除非值为0 忘记定义尺寸的单位是CSS新手普遍的 ...
- POJ 1486 Sorting Slides(寻找必须边)
题意:找出幻灯片与编号唯一对应的情况 思路: 1:求最大匹配,若小于n,则答案为none,否则转2 (不过我代码没有事先判断一开始的最大匹配数是否<n,但这样也过了,估计给的数据最大匹配数一定为 ...
- POJ3087Shuffle'm Up(map)
http://poj.org/problem?id=3087 题意 : 我只能说,,英语不好是硬伤...这个题比较别扭啊,不知道真正题意是不是我所想的,我先把我A了的代码按照的题意的意思说一下,就是说 ...