C#中USB转串口的拔插捕获
// usb消息定义
public const int WM_DEVICE_CHANGE = 0x219;
public const int DBT_DEVICEARRIVAL = 0x8000;
public const int DBT_DEVICE_REMOVE_COMPLETE = 0x8004;
public const UInt32 DBT_DEVTYP_PORT = 0x00000003;
[StructLayout(LayoutKind.Sequential)]
struct DEV_BROADCAST_HDR
{
public UInt32 dbch_size;
public UInt32 dbch_devicetype;
public UInt32 dbch_reserved;
}
[StructLayout(LayoutKind.Sequential)]
protected struct DEV_BROADCAST_PORT_Fixed
{
public uint dbcp_size;
public uint dbcp_devicetype;
public uint dbcp_reserved;
// Variable?length field dbcp_name is declared here in the C header file.
}
/// <summary>
/// 检测USB串口的拔插
/// </summary>
/// <param name="m"></param>
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_DEVICE_CHANGE) // 捕获USB设备的拔出消息WM_DEVICECHANGE
{
switch (m.WParam.ToInt32())
{
case DBT_DEVICE_REMOVE_COMPLETE: // USB拔出
DEV_BROADCAST_HDR dbhd = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_HDR));
if (dbhd.dbch_devicetype == DBT_DEVTYP_PORT)
{
string portName = Marshal.PtrToStringUni((IntPtr)(m.LParam.ToInt32() + Marshal.SizeOf(typeof(DEV_BROADCAST_PORT_Fixed))));
if (cbPort.Items.Contains(portName))
{
cbPort.Items.Remove(portName);
}
if (wr != null)
{
wr.Close();
}
}
break;
case DBT_DEVICEARRIVAL: // USB插入获取对应串口名称
DEV_BROADCAST_HDR dbhdr = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_HDR));
if (dbhdr.dbch_devicetype == DBT_DEVTYP_PORT)
{
string portName = Marshal.PtrToStringUni((IntPtr)(m.LParam.ToInt32() + Marshal.SizeOf(typeof(DEV_BROADCAST_PORT_Fixed))));
if (!cbPort.Items.Contains(portName))
{
cbPort.Items.Add(portName);
}
}
break;
}
}
base.WndProc(ref m);
}
最新文章
- android 自定义控件——(二)圆形按钮,圆形View
- C语言文法
- ThingkPHP对数据库进行改操作
- UITabBarController 更改tabbariteam上的选中图片
- Android EventBus实战 没听过你就out了
- CSS media queries
- Android Library Project 使用问题总结
- 基于Eclipse搭建STM32开源开发环境
- Sharepoint学习笔记—习题系列--70-573习题解析 -(Q28-Q31)
- C++ 11 笔记 (四) : std::bind
- Log4J2基本配置
- EF6 第一次,或者相隔一段时间变慢咋办? 我们来优化下
- 【转】Java方向如何准备BAT技术面试答案(汇总版)
- Oracle数据库 拾漏补缺
- Bootstrap表单验证
- python基础之 正则表达式,re模块
- Composer 安装时要求输入授权用户名密码?
- 树莓派(centos7)安装mysql
- spring cloud 组件图
- 【文章存档】如何通过 GitLab 进行持续部署