首页
学习
活动
专区
工具
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

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

相关·内容

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

一直以来,做为一名Web以及桌面开发人员,我一直在使用.NET框架和C#语言,而在某些项目中,Angular会在前端占有主导地位。 最近,我们总是谈论移动应用程序开发的未来,但我本身实在没有天赋转向另一种语言。最近几年,针对我的社交项目,我尝试使用Hybrid框架和AngularJS以及Ionic,Cordova一起构建一个示例……但一切并不像我想象得那样容易。此后微软于2016年2月份收购了Xamarin并在之后不久宣布了将Xamarin开源。自此微软生成用C#开发的软件将不仅仅能够运行在Windows上,而是可以在任何设备上运行。继微软收购Xamarin之后,对可以将C#开发与全功能的跨平台移动开发工具相结合,使用开发工具共享业务逻辑代码,以提供完全原生的应用程序的专业人士的需求日益增加,这一点自从2011年之后就一发不可收拾。

02
  • P语言: 为异步、容错和不确定性而生的编程语言

    译者注:P语言是一款由微软、加州大学伯克利分校和伦敦帝国学院共同研发完成的编程语言,它在处理并发、故障切换等方面具有很强的优势。本文介绍了P语言的起源、特性及其使用场景。以下是译文。 新兴应用程序的复杂性需要使用新兴的方式去理解,然后才能高效地去构建、测试和调试。现在的应用程序常常会使用云资源,采用人工智能技术,并嵌入到物理设备中。这三个因素的结合使得软件开发变得非常困难。 通常来说,这些现代应用程序都具有异步性,主要表现在:为了提高性能,请求者在当前操作完成之前可继续执行后面的操作。异步不可避免地会产

    06

    【深入浅出C#】章节 1: C#入门介绍:C#的历史和发展

    C#(读作C Sharp)是一种通用、面向对象的编程语言,由微软公司于2000年推出。它在设计之初的目标是为了在.NET平台上开发应用程序,并且它也成为了.NET开发的主要语言之一。C#的历史和产生背景紧密联系着微软公司对软件开发工具和平台的发展。 在20世纪90年代,微软推出了一系列的开发工具和平台,其中最重要的是Visual Basic和C++。然而,随着互联网的普及和软件复杂性的增加,开发者需要一种更强大、更现代化的语言来应对新的挑战。因此,微软开始研发一种新的语言,旨在提供更好的生产力、更强大的面向对象支持和更高的性能。 C#的设计灵感来自于多个编程语言,包括C++、Java和Delphi等。它汲取了这些语言的优点,并融入了自己的特色和创新。C#于2000年首次发布,作为.NET Framework的一部分。它引入了许多创新的语言特性,如委托、属性、泛型和LINQ等,以提供更强大的编程模型和更简洁的代码。 C#的重要性和广泛应用主要体现在以下几个方面:

    02

    微软刚开源的这种开发语言,竟然是个 P

    编者按:微软近日发布了一篇研究报告,介绍了一种为异步性、容错性和不确定性而设计的 P 语言,实现安全的异步事件驱动编程。该语言基于事件进行通信,能够很好的解决并发操作所带来的问题,并能够在软件的构建、测试和调试等各个阶段发挥作用。 新型软件的复杂性导致了编程人员需要新的方法来理解,并有效地构建、测试和调试这些系统。如今的软件通常使用云资源,嵌入在物理世界的设备中,并采用人工智能技术。这三个因素使得今天的软件系统难以发展。 通常现代应用需要异步性来提高性能,比如在下面这种情形:操作的请求者在发起操作后继续运行

    07

    快速入门 .NET nanoFramework 开发 ESP32-Pico 应用

    .NET 支持物联网(IoT) 应用的开发,其提供的.NET IoT 库可以让我们在运行 Windwos 和 Linux 系统的 IoT 设备上运行应用,并利用 GPIO、SPI、I2C、PWM 和串行端口等接口使用数百个传感器、显示器、输入设备。但是这并不适用于受约束的嵌入式设备,比如 ESP32、M5Stack、STM32 等。对于这些受约束的嵌入式设备,.NET nanoFramework 提供了一个很好的方案,适用于这些微控制器,能够为受限嵌入式设备编写托管代码。开发者可以利用熟悉的 IDE Visual Studio 和 .NET(C#) 知识快速编写应用程序,而无需担心微控制器的低层硬件复杂性。更方便的是,使用 Visual Studio 可以直接在真实硬件上编写、部署、调试代码。

    02
    领券