首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何检测USB断开事件?(Windows,.NET C#应用程序)

要检测USB设备断开事件,您可以使用Windows操作系统的设备管理器API。以下是一个简单的示例,说明如何使用C#编写的.NET应用程序来检测USB设备断开事件。

首先,您需要添加以下命名空间:

代码语言:csharp
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

然后,您可以使用以下代码来检测USB设备断开事件:

代码语言:csharp
复制
public class UsbDeviceNotification
{
    public delegate void UsbDeviceEventHandler(object sender, UsbDeviceEventArgs e);

    public event UsbDeviceEventHandler UsbDeviceDisconnected;

    public void Start()
    {
        // 注册设备接口通知
        RegisterForDeviceNotifications(IntPtr.Zero);
    }

    public void Stop()
    {
        // 注销设备接口通知
        UnregisterDeviceNotifications();
    }

    private IntPtr _deviceNotificationHandle;

    private void RegisterForDeviceNotifications(IntPtr windowHandle)
    {
        var deviceInterfaceClassGuid = new Guid("{A5DCBF10-6530-11D2-901F-00C04FB951ED}"); // 系统设备接口GUID

        var deviceChangeFilter = new DEV_BROADCAST_DEVICEINTERFACE
        {
            dbcc_size = Marshal.SizeOf(typeof(DEV_BROADCAST_DEVICEINTERFACE)),
            dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE,
            dbcc_classguid = deviceInterfaceClassGuid,
        };

        var deviceChangeFilterSize = Marshal.SizeOf(deviceChangeFilter);
        var deviceChangeFilterBuffer = Marshal.AllocHGlobal(deviceChangeFilterSize);
        Marshal.StructureToPtr(deviceChangeFilter, deviceChangeFilterBuffer, true);

        _deviceNotificationHandle = RegisterDeviceNotification(windowHandle, deviceChangeFilterBuffer, DEVICE_NOTIFY_WINDOW_HANDLE);

        Marshal.FreeHGlobal(deviceChangeFilterBuffer);
    }

    private void UnregisterDeviceNotifications()
    {
        if (_deviceNotificationHandle != IntPtr.Zero)
        {
            UnregisterDeviceNotification(_deviceNotificationHandle);
            _deviceNotificationHandle = IntPtr.Zero;
        }
    }

    private void OnUsbDeviceDisconnected(UsbDeviceEventArgs e)
    {
        UsbDeviceDisconnected?.Invoke(this, e);
    }

    private const int DBT_DEVTYP_DEVICEINTERFACE = 0x00000005;
    private const int DEVICE_NOTIFY_WINDOW_HANDLE = 0x00000000;

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr RegisterDeviceNotification(IntPtr recipient, IntPtr notificationFilter, int flags);

    [DllImport("user32.dll")]
    private static extern bool UnregisterDeviceNotification(IntPtr handle);

    [StructLayout(LayoutKind.Sequential)]
    private struct DEV_BROADCAST_DEVICEINTERFACE
    {
        internal int dbcc_size;
        internal int dbcc_devicetype;
        internal int dbcc_reserved;
        internal Guid dbcc_classguid;
        internal short dbcc_name;
    }
}

public class UsbDeviceEventArgs : EventArgs
{
    public string DeviceName { get; set; }
}

要使用此类,请创建一个新的UsbDeviceNotification实例,并订阅UsbDeviceDisconnected事件。当USB设备断开连接时,事件将触发。

代码语言:csharp
复制
var usbDeviceNotification = new UsbDeviceNotification();
usbDeviceNotification.UsbDeviceDisconnected += OnUsbDeviceDisconnected;

usbDeviceNotification.Start();

// 当不再需要检测USB设备断开事件时,调用以下方法
usbDeviceNotification.Stop();

private void OnUsbDeviceDisconnected(object sender, UsbDeviceEventArgs e)
{
    Console.WriteLine($"USB设备已断开连接: {e.DeviceName}");
}

请注意,此示例仅适用于Windows操作系统。如果您需要在其他平台上检测USB设备断开事件,请考虑使用跨平台解决方案,如LibUsbDotNet

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何使用 Visual C# .NET 对 DataGrid Windows 控件执行分页

如何使用 Visual C# .NET 对 DataGrid Windows 控件执行分页 察看本文应用于的产品 文章编号 : 307710 最后修改 : 2005年3月23日 修订 : 3.1...本文演示了如何为 DataGrid Windows 控件创建简单的分页机制。 本文的代码示例利用了 DataSet 对象。...在 ADO.NET 中,DataSet 对象是通过单次操作填充的并且永驻在内存中。如果您正在使用一个大型 DataSet,本文将为您介绍如何通过编程按块或页显示数据。...SQL Server 7.0 或更高版本 本文假定您熟悉下列主题: • Visual C# .NET • ADO.NET 基础知识和语法 回到顶端 向 DataGrid Windows...打开一个新的 Visual C# .NET Windows 应用程序项目。 2. 添加 DataGrid 控件,将其 ReadOnly 属性设置为 True。 3.

1.6K100

C#上位机开发与工控通讯实战课程

不多用,暂不介绍  Windows上位机(EXE可执行程序),最早用VB语言开发,后来由于C++的发展,采用MFC开发,近几年,微软发布了基于.NET框架的面向对象语言C#,更加稳定安全,再配合微软强大的...安装Visual Studio首先,确保你已经安装了Visual Studio,这是开发C#应用程序的常用IDE。你可以从Visual Studio官方网站下载并安装最新版本。2....创建新项目打开Visual Studio,选择“创建新项目”,选择“Windows窗体应用(.NET Framework)”,然后点击“下一步”。输入项目名称和位置,点击“创建”即可。...在项目模板中,选择适合上位机开发的Windows Forms应用程序或WPF应用程序。然后,输入项目名称、保存位置等信息,并创建项目。...4、编写代码:为控件添加事件处理程序,如点击事件、鼠标移动事件等。在事件处理程序中,编写相关的逻辑代码,实现数据采集、处理、显示等功能。

17800
  • .NET周刊【2月第1期 2024-02-04】

    【OpenVINO™】在 Windows 上使用 OpenVINO™ C# API 部署 Yolov8-obb 实现任意方向的目标检测 https://www.cnblogs.com/guojin-blogs...同时,介绍了新书《C#与.NET6 开发从入门到实践》,并分享了如何通过复制开源项目代码来增强TestServer的HttpClient功能。...SignalR Core 的 CPU 使用率过高以及如何处理。 其他主题包括使用事件计数器跟踪指标、部署到生产的结果以及未来的前景。...默认预测调试模式 进程外更新 Web开发 在容器和远程环境中执行单元测试 人工智能助手 其他计划 文章、幻灯片等 如何将 .NET Aspire 应用程序部署到 Azure 容器应用程序 - .NET...Aspire 和独特的事件源框架来创建使用 Cosmos DB 作为数据存储的应用程序的说明。

    20610

    dotnet 从入门到放弃的 500 篇文章合集

    所有博客 .net Framework 源代码 · Ink .net Framework 源代码 · ScrollViewer .net remoting 使用事件 .net remoting 抛出异常...,求距离的点 C# 强转会不会抛出异常 C# 很少人知道的科技 C# 快速释放内存的大数组 C# 搜索算法 C# 获得设备usb信息 C# 转换类型和字符串 C# 遍历枚举 C# 金额转中文大写 C#将...C# 判断文件编码 C# 字符串首字符大写 C# 局部函数与事件 C# 枚举转字符串 C# 相对路径转绝对路径 C# 解析 sln 文件 C# 谁改了我的代码 C# 通配符转正则 C#判断文件属于文本或二进制...C#判断文件是否被混淆 C#同步方法转异步 C#命令行解析工具 C#委托 C#枚举中使用Flags特性 dot net core 使用 IPC 进程通信 dot net core 使用 usb dot...Magick.NET 播放 gif 图片 WPF 如何在 WriteableBitmap 写文字 WPF 如何在应用程序调试启动 WPF 如何在绑定失败异常 WPF 如何画出1像素的线 WPF 如何调试

    10.5K20

    .NET周刊【1月第1期 2025-01-05】

    文章指出鼠标、触笔和触摸三类事件的行为差异,详细描述了如何在不同输入设备下触发这些事件。通过实际案例,作者展示了如何通过步骤复现该问题,并提供了相关代码示例,以说明如何正确捕获各种输入事件。...它适用于 Windows 桌面,提供标准控件、额外设计控件以及平滑过渡效果。用户可通过 Visual Studio 安装并配置该工具包,方便快捷地开发现代化应用程序。...示例展示了如何安装、调度任务、使用队列、注册事件和发送邮件。项目地址在GitHub。...C# 标准 - 多重启动预防 - Qiita https://qiita.com/chai0917/items/d59c52e4c12ce0a892f4 如何防止多次启动应用程序。...C#:对象池和版本模式 https://zenn.dev/ruccho/articles/e9876dadeca78a 关于在使用/实现像 ValueTask 这样的对象池时通过版本来检测不正确使用的模式

    6910

    C#问题攻克之使用winform调用人脸识别接口

    WinForm简介 lWinForm 是 Windows Form 的简称,是基于 .NET Framework 平台的客户端(PC软件)开发技术,一般使用 C# 编程。...C# WinForm 编程需要创建「Windows窗体应用程序」项目。 l.NET 提供了大量 Windows 风格的控件和事件,我们可以直接拿来使用,上手简单,开发快速。...lWindows 窗体应用程序是 C# 语言中的一个重要应用,也是 C# 语言最常见的应用。这套 C# WinForm 教程将教会大家如何使用 WinForm 开发一个简单的应用。...使用 C# 语言编写的 Windows 应用程序与 Windows 操作系统的界面类似,每个界面都是由窗体构成的,并且能通过鼠标单击等操作完成相应的功能。...选择C#语言,选择Windows 窗体应用(.NET Framework)。 [ajtek1jbtj.png] 第二步. 把项目名称命名为WinFormDemo,然后单击创建。

    3.2K00

    史上最全Windows安全工具锦集

    下载地址:http://www.exeinfo.xn.pl/ DetectIt Easy 开源的PE侦壳工具,是一个跨平台的应用程序,有Windows、Linux、Mac OS多个可用版本: ?...解决了OD对64位应用程序调试上的缺陷: ? 下载地址:https://x64dbg.com/#start dnSpy 一款针对.NET程序的开源逆向程序的工具。...用来监视和记录系统活动,并记录到windows事件日志,可以提供有关进程创建,网络链接和文件创建时间更改的详细信息: ?...下载地址:https://my.comae.com/tools 设备监控 USBLogView 一款USB设备监控软件,后台运行,可以记录插入或拔出系统的任何USB的详情信息: ?...下载地址:https://www.nirsoft.net/utils/usb_log_view.html 集成工具 PC Hunter 一款驱动级的系统维护工具,能够查看各种Windows的各类底层系统信息

    3.3K51

    增强用户体验:2个功能强大的.NET控制台应用帮助库

    前言 对于.NET开发者而言,构建控制台应用程序时,如何提升用户交互的流畅性和满意度,是一个持续探索与优化的话题。...Terminal.Gui Terminal.Gui是一个跨平台(Windows、Mac 和 Linux/Unix )、开源(遵循 MIT License)、免费的用于为.NET、.NET Core 和...Spectre.Console Spectre.Console是一个.NET开源且免费的类库帮你轻松的创建漂亮、美观的.NET控制台应用程序。...该库将检测当前终端的功能,并根据需要降低颜色。...优秀项目和框架精选 以上项目都已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量

    11110

    Xamarin 学习笔记 - 配置环境(Windows & iOS)

    背景介绍 一直以来,做为一名Web以及桌面开发人员,我一直在使用.NET框架和C#语言,而在某些项目中,Angular会在前端占有主导地位。...自此微软生成用C#开发的软件将不仅仅能够运行在Windows上,而是可以在任何设备上运行。...Xamarin使得你可以使用C#创建原生的应用。 在文章的另一部分,我将从定义硬件和软件需求开始入手,即便是你没有任何的移动端开发经验,也能够开始了解如何开始构建一个移动应用。...通过将你的设备与IDE配对,我们可以在设备上直接部署,测试和调试应用程序。 那么,我们如何使用它? 这很简单,我们可以从你的设备中选择一个新的目标开始使用这一功能。 ? ?...伴随着崩溃,我们需要了解一些分析以了解更多客户,因此,从应用中心,我们可以记录自定义事件。 最后,它是推送通知的单一来源。

    6.2K20

    .NET周报 【6月第4期 2023-06-25】

    会在无操作情况下自动断开连接,导致不美观的重连接界面及灰色效果。我们将使用微软提供的解决方案来处理这个问题。 C#/.Net的多播委托到底是啥?...精细代码覆盖 - Visual Studio Marketplace 【英文】如何使用 Memgraph、C# 和 D3.js 构建基于航班网络分析图的 ASP.NET 应用程序 https://memgraph.../ 了解如何在 ASP.NET Core 应用程序中使用 Microsoft Graph 重置用户密码。...【日文】在 .NET 字符串比较中检测未指定的区域性 https://ufcpp.net/blog/2023/6/ca-specify-culture/ 当未指定区域性时,如何在字符串比较中发出警告/错误...【英文】如何检测堆分配 https://bartwullems.blogspot.com/2023/06/how-to-detect-heap-allocations.html 关于如何检测堆分配。

    29820

    【翻译】.NET Framework 4.5新特性

    开发者预览版.net 4.5 .NET for Metro style apps Metro风格的应用程序是利用Windows操作系统的强大功能设计的特殊表单元素。...一个称之为.NET APIs for Metro style apps的.Net的一个子集用来支持Metro风格的应用程序, 可以使用C#或Visual Basic来编写Metro风格的应用程序。...(你可以不必使用类特性来创建部件,现在可以按命名约定来创建你的部件) -多作用域 异步文件操作 在.NET框架4.5开发者预览版中, 基于任务模型的异步操作特性被添加到C#和Visual Basic语言...Windows Presentation Foundation (WPF) 在.NET框架4.5开发人员预览版中,Windows Presentation Foundation(WPF)包含以下几个方面的变化和改进...-可以检查容器的数据上下文是否断开链接。 -可以设置属性、数据源改变的超时时间 -实施弱事件模式的改进支持。此外,事件现在可以接受的扩展标记。

    88020

    在C#.NET应用程序开发中创建一个基于Topshelf的应用程序守护进程(服务)

    文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf创建Windows服务程序及服务的安装和卸载 (1) 在C#/.NET应用程序开发中创建一个基于...Topshelf的应用程序守护进程(服务) (2) C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案 (3) 前言 在上一篇文章...《C#/.NET基于Topshelf创建Windows服务程序及服务的安装和卸载》中,我们了解发C#/.NET创建基于Topshelf Windows服务程序的大致流程,参数配置以及服务的安装和卸载。...本文主要演示在C#/.NET应用程序开发中创建一个基于Topshelf的应用程序守护进程(服务)。...应该如何解决呢??? 预知后事如何请听下回分解(未完待续)... 好了,今天的在C#/.NET应用程序开发中创建一个基于Topshelf的应用程序守护进程(服务)的分享就到这里。

    2.1K20
    领券