zoukankan      html  css  js  c++  java
  • 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);
    }

  • 相关阅读:
    python自动化测试-使用第三方python库技术实现
    JMeter目录结构
    JMeter Http请求之content-type用法
    JMeter生成性能报表-Windows环境和Linux环境
    JMeter4.0 IF Controller
    c++ 初始化列表和构造函数初始化区别
    关于C++ 中 thread 的拷贝构造函数
    函数的参数类型 指针和指针的引用的区别
    window10 vs2013 SIFTGPU
    Qt使用双缓冲绘图时报错:pure virtual method called
  • 原文地址:https://www.cnblogs.com/liujianshe1990-/p/10668818.html
Copyright © 2011-2022 走看看