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

最新文章

  1. android 自定义控件——(二)圆形按钮,圆形View
  2. C语言文法
  3. ThingkPHP对数据库进行改操作
  4. UITabBarController 更改tabbariteam上的选中图片
  5. Android EventBus实战 没听过你就out了
  6. CSS media queries
  7. Android Library Project 使用问题总结
  8. 基于Eclipse搭建STM32开源开发环境
  9. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q28-Q31)
  10. C++ 11 笔记 (四) : std::bind
  11. Log4J2基本配置
  12. EF6 第一次,或者相隔一段时间变慢咋办? 我们来优化下
  13. 【转】Java方向如何准备BAT技术面试答案(汇总版)
  14. Oracle数据库 拾漏补缺
  15. Bootstrap表单验证
  16. python基础之 正则表达式,re模块
  17. Composer 安装时要求输入授权用户名密码?
  18. 树莓派(centos7)安装mysql
  19. spring cloud 组件图
  20. 【文章存档】如何通过 GitLab 进行持续部署

热门文章

  1. 贾天昊 - Nick
  2. JDK和Tomcat安装和配置过程
  3. JDK1.8-Java虚拟机运行时数据区域和HotSpot虚拟机的内存模型
  4. SpringIOC原理简述
  5. Spring boot 配置文件详解 (properties 和yml )
  6. JVM之垃圾收集器
  7. Java枚举储存的一种索引实现方式
  8. ReactiveSwift源码解析(二) Bag容器的代码实现
  9. [AI分享]零高数理解人工智能和深度学习
  10. SpringBoot/SpringMVC文件下载方式