C# 上位机的USB设备拔插检测
我们做USB通信时,通信成功后,往往要检测USB设备的拔插状态,这里就USB拔插进行一下说明。
参考:https://www.imooc.com/article/17438
先说明一下,我这里只是用C#写上位机的自定义USB设备的检测,是调用window的DLL来实现USB设备通信的,具体通信过程说明,我会在后期补上。
要实现USB插拔检测,就不得不说到WM_DEVICECHANGE 消息了,当设备被插入/拔出的时候,WINDOWS会向每个窗体发送WM_DEVICECHANGE 消息,而WM_DEVICECHANGE
消息则是由窗口通过其WindowProc函数接收此消息。
Winform中WndProc 函数作用:主要用在拦截并处理系统消息和自定义消息。比如:windows程序会产生很多消息,比如你单击鼠标,移动窗口都会产生消息。这个函数就是默认的消息处
理函数。你可以重载这个函数来制定自己的消息处理流程.在Winform程序中,可以重写WndProc函数,来捕捉所有发生的窗口消息。这样,我们就可以"篡改"传入的消息,而人为的让窗口改
变行为。我们用C#实现检测U盘插拔的功能,是用重写C# WndProc函数来做到的。
至于怎么操作,我们下面再说明,现在我们先来看一下微软对WindowProc函数的解析。
WindowProc函数原型:
LRESULT CALLBACK WindowProc(HWND hwnd, // handle to window 窗口句柄
UINT uMsg, // WM_DEVICECHANGE WM_DEVICECHANGE标识符
WPARAM wParam, // device-change event 发生的事件值,不同的值有着不同的意义,下面会说到
LPARAM lParam ); // event-specific data 指向包含特定于事件的数据的结构的指针,其格式取决于wParam参数的值
函数返回值:正确返回TRUE以授予请求,否则返回BROADCAST_QUERY_DENY以拒绝请求。
wParam值的具体含义:
值 | 含义 |
---|---|
|
更改当前配置(停靠或取消停靠)的请求已被取消。 |
|
由于停靠或取消停靠,当前配置已更改。 |
|
发生了自定义事件。 |
|
已插入设备或介质,现已可用。 |
|
要求许可删除设备或媒体。任何应用程序都可以拒绝此请求并取消删除。 |
|
已取消删除设备或介质的请求。 |
|
已删除设备或介质。 |
|
即将移除设备或介质。不能否认。 |
|
发生了特定于设备的事件。 |
|
已在系统中添加或删除设备。 |
|
请求权限更改当前配置(停靠或取消停靠)。 |
|
此消息的含义是用户定义的。 |
看到这里你可能对怎用WM_DEVICECHANGE 消息实现USB拔插检测有一个初步了解了,具体怎么实现,下面我用个例子来说明。
这里我先说明一下思路:
1.重写WndProc 函数捕捉所有发生的窗口消息,重写的主要内容为2、3、4;
2.当USB拔插时 WM_DEVICECHANGE 消息会传递到 WndProc 函数,也就是uMsg这个值;
3.第二步是window自动完成的,这里我们要做的是读出wParam的值,根据这个值判断触发了什么对应的事件;
4.根据第三步,判断出相应的操作后,我们就可以根据触发的对应事件,编写执行不同的操作代码了;
5.把这个重写函数放在 private void Form1_Load(object sender, EventArgs e) { } 函数后面,不用用户去调用,在你运行窗体后,系统会自动调用的。
重写WndProc 函数具体例程代码如下:
/* ======================USB 插拔检测=========================== */
protected override void WndProc(ref Message m)
{
//Console.WriteLine(m.WParam.ToInt32()); //打印程序检测到的变化信息
try
{
//检测到USB口发生了变化,这里USB口变化时wParam的值是7,表示系统中添加或者删除了设备
if (m.WParam.ToInt32() == )
{
UsBMethod(); //检测到USB口有变化时重新连接一次自己要检测的设备,连接不成功则可以判断设备已断开(个函数是USB连接函数) if (flag == ) //没找到设备处理事件,我这里 flag=0 表示设备没连接成功
{
Dispost(); //关闭设备,该函数的作用是关闭USB设备的连接
MessageBox.Show(" USB 已断开!");
}
else
{
//这里可以添加设备没有断开的处理代码
}
} }
catch (Exception ex)
{
MessageBox.Show(ex.Message); //异常处理函数
}
base.WndProc(ref m); //这个是windos的异常处理,一定要添加,不然会运行不了
}
好啦,到这里重写WndProc 函数就完成了,注意:要把这个函数放在 private void Form1_Load(object sender, EventArgs e) { } 函数后面就可以了,不用用户去调用,打开程序时系统就会自动后台运行了。
C# 上位机的USB设备拔插检测的更多相关文章
- android 获取设备拔插状态广播事件易漏掉的一行属性!
我们都知道设备拔插的状态获取需要一个权限 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILES ...
- Delphi在Android下实现BroadcastReceiver功能(举例在Delphi下获取USB外设拔插消息)
在Android里,用java通过实现BroadcastReceiver接口,就可以获得Intent消息.可是Delphi程序不能直接实现JBroadcastReceiver,如何能够实现类似Java ...
- 检测 USB 设备拨插的 C# 类库:USBClassLibrary
这是采用C#开发的一个USB库,使您可以管理USB设备的连接和分离事件,探测自己的设备.可以运行在Windows XP和Windows7 64位系统下. 01 private void USBPort ...
- 上位机用USB做虚拟串口,总算抓到一个纯代码的总结了,没有坑的完美解决。
用libUSB来实现自己的驱动+下位机理论速度.=1M字节每秒. 达到极限速度 WINDOWS已经自带虚拟串口驱动,只不过还需要一个Inf文件 方法1:直接下载一个串口inf,来修改文件. 方 ...
- winAPI 检查系统设备拔插使用 WM_DEVICECHANGE 消息
if(message->message == WM_DEVICECHANGE) { /*if (message->wParam == DBT_DEVICEARRIVAL || messag ...
- STM32 软件复位并模拟USB拔插
最近做了个USB跟上位机的通信,需要软件对MCU进行复位,复位后如果USB没有拔插,PC就不会重新枚举USB为了解决这个问题,我做了软件复位跟,软件模拟USB拔插. 这里我用的是HAL库的软件复位,复 ...
- KVM客户机使用主机USB设备
有些时候KVM客户机还是要使用USB设备,比如USB密钥等 KVM命令行参数 -usb 打开usb驱动程序,启动客户机usb支持 -usbdevice devname 为客户机增加usb设备,devn ...
- 2018最新mfc作为上位机接收硬件端USB或串口数据显示成图片 解决串口接收数据丢字节丢包问题
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9490616.html 本文用的是VS2013MFC写串口数据接收: 第一步:首先建立一个MFC ...
- USB设备驱动概述
USB设备驱动 · )USB Hub:每个USBHost控制器都会自带一个USB Hub,被称为根(Root)Hub.这个根Hub可以接子(Sub)Hub,每个Hub上挂载USB设备.一般PC有8个 ...
随机推荐
- Problem 11
Problem 11 # Problem_11.py """ In the 20×20 grid below, four numbers along a diagonal ...
- 【codeforces 803F】Coprime Subsequences
[题目链接]:http://codeforces.com/contest/803/problem/F [题意] 给你一个序列; 问你这个序列里面有多少个子列; 且这个子列里面的所有数字互质; [题解] ...
- Ajax发送简单请求案例
所谓简单请求,是指不包含任何参数的请求.这种请求通常用于自动刷新的应用,例如证券交易所的实时信息发送.这种请求通常用于公告性质的响应,公告性质的响应无需客户端的任何请求参数,而是由服务器根据业务数据自 ...
- java中File的delete()方法删除文件失败的原因
java中File的delete()方法删除文件失败的原因 学习了:http://hujinfan.iteye.com/blog/1266387 的确是忘记关闭了: 引用原文膜拜一下: 一般来说 ja ...
- [Performance] Optimize Paint and Composite for the website
"Paint" is one of the most preference killer, it can easily cost more than 60fps, and once ...
- 《SAS编程与数据挖掘商业案例》学习笔记之十五
继续<SAS编程与数据挖掘商业案例>读书笔记,本次重点:输出控制 主要内容包含:log窗体输出控制.output窗体输出控制.ods输出控制 1.log窗体输出控制 将日志输出到外部文件 ...
- 关于心理的二十五种倾向(查理·芒格)-2
5)避免不一致倾向避免不一致倾向实际上就是人天生就害怕改变.相同是由于人类大脑的生理机制决定的.由于这样的倾向能够带来节省运算空间和能量的优点.这样的抗改变模式的形成,可能的原因例如以下:A) 迅速作 ...
- Deming管理系列(1)——开车仅仅看后视镜
问题: 当业务经理被要求为未来的业务做计划时,他会提出一个自觉得不错的数字,而董事会往往希望能获得更大的收益,多次与其谈判.而业务经理在这方面不是新手,他有非常多可用的报告. 为什么不能让业务规划流程 ...
- 《coredump问题原理探究》Linux x86版7.8节vector相关的iterator对象
在前面看过了一个vectorcoredump的样例,接触了vector的iterator,能够知道vector的iterator仅仅有一个成员_M_current指向vector某一个元素. 先看一个 ...
- 【opencv】opencv在vs下的配置(持续更新)
经常使用配置记录,会更新下去. 1.去掉ipch及.sdf文件 opencv在vs编译会得到很多文件.当中.dsf和ipch文件就有几十M.总是非常占空间,而这都是用来保存C++预编译的头文件和Int ...