首页 > 其他分享 >监听USB设备插拔

监听USB设备插拔

时间:2024-09-04 16:47:07浏览次数:10  
标签:插拔 const USB int 监听 DBT dbcc public 设备

    /// <summary>
    /// 监听USB设备插拔
    /// </summary>
    public class UsbNotification
    {
        [DllImport("user32.dll")]
        public static extern IntPtr RegisterDeviceNotification(IntPtr hRecipient, IntPtr NotificationFilter, UInt32 Flags);

        [DllImport("user32.dll")]
       public static extern bool UnregisterDeviceNotification(IntPtr hHandle);
      public const int WM_DEVICECHANGE = 0x219;               //U盘插入后,OS的底层会自动检测到,然后向应用程序发送“硬件设备状态改变“的消息
      public const int DBT_DEVICEARRIVAL = 0x8000;            //就是用来表示U盘可用的。一个设备或媒体已被插入一块,现在可用。
      public const int DBT_CONFIGCHANGECANCELED = 0x0019;     //要求更改当前的配置(或取消停靠码头)已被取消。
      public const int DBT_CONFIGCHANGED = 0x0018;            //当前的配置发生了变化,由于码头或取消固定。
      public const int DBT_CUSTOMEVENT = 0x8006;              //自定义的事件发生。 的Windows NT 4.0和Windows 95:此值不支持。
        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_DEVICETYPESPECIFIC = 0x8005;       //一个设备特定事件发生。
        public const int DBT_DEVNODES_CHANGED = 0x0007;         //一种设备已被添加到或从系统中删除。
        public const int DBT_QUERYCHANGECONFIG = 0x0017;        //许可是要求改变目前的配置(码头或取消固定)。
        public const int DBT_USERDEFINED = 0xFFFF;              //此消息的含义是用户定义的
        public const int DBT_DEVTYP_VOLUME = 0x00000002;

/// <summary>
/// 注册设备RegisterDeviceNotification-设备类型
/// </summary>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
 public struct DEV_BROADCAST_DEVICEINTERFACE
 {
     public int dbcc_size;       // 此结构的大小(以字节为单位)。 这是成员的大小加上 dbcc_name 字符串的实际长度
     public int dbcc_devicetype; // 设置为 DBT_DEVTYP_DEVICEINTERFACE。
     public int dbcc_reserved;   // 保留值;请勿使用。
     public Guid dbcc_classguid; // 接口设备类的 GUID。        
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]
    public string dbcc_name;    // 一个以 null 结尾的字符串,指定设备的名称。
}
  
   public static void WndProc(ref Message m)
   {
       try
       {
           if (m.Msg == WM_DEVICECHANGE && m.LParam != IntPtr.Zero)
           {
               switch (m.WParam.ToInt32())
               {
                   case WM_DEVICECHANGE:
                           MessageBox.Show("硬件设备状态改变");
                break;
            case DBT_DEVICEARRIVAL:
                var camera = GetCameraSN(m.LParam);
                if (!string.IsNullOrWhiteSpace(camera))
                {
                    MessageBox.Show(camera + "相机已被插入,现在可用");
                }
                MessageBox.Show(GetCameraSN(m.LParam) + "一个设备或媒体已被插入一块,现在可用");
                break;
                case DBT_DEVICEREMOVECOMPLETE:
                    MessageBox.Show(GetCameraSN(m.LParam) + "一个设备或媒体片已被移除");
                    break;
                case DBT_DEVNODES_CHANGED:
                    Console.WriteLine("一种设备已被添加到或从系统中删除。");
                    break;
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

     private static string GetCameraSN(IntPtr lParm)
     {
         DEV_BROADCAST_DEVICEINTERFACE pdbch = (DEV_BROADCAST_DEVICEINTERFACE)Marshal.PtrToStructure(lParm, typeof(DEV_BROADCAST_DEVICEINTERFACE));
         if (pdbch.dbcc_name.Contains("TSAM150A23B"))
                    return Regex.Split(pdbch.dbcc_name, "#")[2];
    else return null;
}
  private static IntPtr notificationHandle;  // 通知句柄(这里给窗口句柄)
  /// <summary>
  /// 指定(注册)一个窗口,以便在USB设备插入或拔出时接收通知。
  /// </summary>
  /// <param name="windowHandle">接收通知的窗口句柄。</param>
  public static IntPtr RegisterUsbDeviceNotification(IntPtr windowHandle)
  {
      DEV_BROADCAST_DEVICEINTERFACE devInterface = new DEV_BROADCAST_DEVICEINTERFACE();
      devInterface.dbcc_size = Marshal.SizeOf(devInterface);
      devInterface.dbcc_devicetype = 0x00000005; // DBT_DEVTYP_DEVICEINTERFACE
            devInterface.dbcc_reserved = 0;
            devInterface.dbcc_classguid = Guid.Empty; // 使用Guid.Empty来监听所有设备

            IntPtr devInterfacePtr = Marshal.AllocHGlobal(devInterface.dbcc_size);
               Marshal.StructureToPtr(devInterface, devInterfacePtr, true);

    // 注册设备通知
    notificationHandle = RegisterDeviceNotification(windowHandle, devInterfacePtr, 0x00000004);
    return notificationHandle;

}
    /// <summary>
    /// 注销USB设备通知窗口
    /// </summary>
   public static void UnregisterUsbDeviceNotification()
   {
       UnregisterDeviceNotification(notificationHandle);
   }

调用

  UsbNotification.RegisterUsbDeviceNotification(this.Handle);

   UsbNotification.WndProc(ref m);

 

标签:插拔,const,USB,int,监听,DBT,dbcc,public,设备
From: https://www.cnblogs.com/aaaaq/p/18396848

相关文章

  • PC电源,USB Type-C通用型双向同步升降压控制器支持5V驱动可编程输出输入电流限制
    概述:PC1045是一款同步升降压控制器,适用于驱动高效电源转换器中的MOSFET或氮化镓(GaN)等功率器件。它支持高达45V的宽输入和输出电压范围,并可在降压、升降压和升压模式之间无缝转换。PC1045集成了具有UVLO保护功能的上管和下管栅极驱动器。它提供可编程电感峰值电流限制和输......
  • USB gadget驱动框架(三)
    gadget驱动框架(三)usb_udc与usb_gadget_driver的绑定usb_udc与usb_gadget_driver,在注册的时候分别被添加到udc_list和gadget_driver_pending_list中,无论这两者先后顺序如何,都将会动态的去识别及匹配到具体设备中,绑定过程如下:源码:drivers/usb/gadget/udc/core.c/*-------------......
  • USB gadget functionfs
    FunctionFS(FunctionFilesystem)是LinuxUSBGadget框架的一部分,专门用于从用户空间实现和控制自定义的USB功能。它提供了一种文件系统接口,使用户能够在用户空间中直接定义USB设备的接口、端点和描述符,并管理USB数据的传输。FunctionFS常用于需要用户空间控制的复杂U......
  • USB gadget configfs
    概述USBLinuxGadget是一种具有UDC(USB设备控制器)的设备,可以连接到USB主机,以扩展其附加功能,如串口或大容量存储能力。一个gadget被它的主机视为一组配置,每个配置都包含一些接口,从gadget的角度来看,这些接口被称为功能,每个功能代表一个串行连接或一个SCSI磁盘。Linux提供了许......
  • Openwrt中挂载NTFS格式USB硬盘无法正常显示中文目录及文件的解决办法
    在试图挂载硬盘使用alist作视频站的时候,我发现Openwrt访问自动挂载上的USB硬盘目录时,只能看得到英文的目录和文件。这就是固件自动挂载不太灵光的地方了自动挂载是Openwrt导航栏-系统-挂载点的[自动挂载磁盘]选项与[挂载已连接的设备]按钮。平常不想动手敲命令的时候固然很方便,但......
  • USB虚拟化与重定向
    USB虚拟化是一个虚拟的系统结构。    虚拟可以出现在不同层次上。各级的虚拟化产生了不同的虚拟化概念。这是许多概念,不同的人有不同的观点。1、连接USB。   USB连接功能是在虚拟机上直接分配USB设备,在虚拟机上应用,实现对USB设备的直接访问和访问。因此,必须先在......
  • 【USB】C#使用HID通信
    https://blog.csdn.net/gzylongxingtianxia/article/details/137151349 最近做了一个USB通信SDK,通过HID跟单片机通信,之前研究了一下Libusb,Cyusb,要么死的太早,要么封装的不好,最后绕来绕去发现还是HID好用,反编译了一个SimpleHid,别说,用起来还是很酸爽的~~~1.设备识别首先......
  • 安卓13拦截home功能 监听home键 禁用home键
    总纲android13rom开发总纲说明目录1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言  经常遇到客户监听某个按键的需求,其实有些功能APP本身就可以处理的,......
  • 基于元神操作系统编程写USB扇区
    1.背景本文介绍了“调用元神操作系统API向U盘扇区写数据”的程序实现及测试结果。2.方法(1)调用元神操作系统API读U盘扇区本部分内容已在前面的文章中进行介绍,详细内容请参考“编写程序调用元神操作系统的API”。(2)调用元神操作系统API写U盘扇区本例通过调用系统API来向U......
  • USB LFPS是什么?
    USBLFPS:低功耗状态下的高速数据传输什么是USBLFPS?USBLFPS(Low-PowerSignaling)指的是USB接口在低功耗状态下的一种高速数据传输技术。传统上,USB接口在低功耗模式下,数据传输速率会大幅降低,以节省功耗。而LFPS技术则通过优化信号传输方式,使得USB设备在低功耗状态下仍能保持较高......