WMI-设备监听-串口

Console.WriteLine("Ports:");
foreach (var item in SerialPortService.SerialPortNames)
{
    Console.Write("	{0}", item);
}
Console.WriteLine();
SerialPortService.SerialPortsChanged += (sender, e) =>
{
    Console.WriteLine(e.EventType + ", Ports:");
    foreach (var item in SerialPortService.SerialPortNames)
    {
        Console.Write("	{0}", item);
    }
    Console.WriteLine();
};

/// <summary>
/// 监测串口变化
/// </summary>
public static class SerialPortService
{
    static SerialPortService()
    {
        _serialPortNames = GetSerialPortNames();
        MonitorDeviceChanges();
    }

    private static void MonitorDeviceChanges()
    {
        try
        {
            var arrivalQuery = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2");
            var removalQuery = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 3");

            _arrival = new ManagementEventWatcher(arrivalQuery);
            _arrival.EventArrived += (sender, e) => OnPortsChanged(EventType.Insertion);
            _arrival.Start();
            _removal = new ManagementEventWatcher(removalQuery);
            _removal.EventArrived += (sender, e) => OnPortsChanged(EventType.Removal);
            _removal.Start();
        }
        catch (Exception ex)
        {
            string err = ex.Message;
        }
    }

    private static void OnPortsChanged(EventType eventType)
    {
        lock (_serialPortNames)
        {
            var availablePorts = GetSerialPortNames();
            if (!_serialPortNames.SequenceEqual(availablePorts))
            {
                _serialPortNames = availablePorts;
                RaiseSerialPortsChanged(eventType);
            }
        }
    }

    private static void RaiseSerialPortsChanged(EventType eventType)
    {
        SerialPortsChanged?.Invoke(null, new SerialPortsChangedEventArgs(eventType, _serialPortNames));
    }

    private static string[] GetSerialPortNames()
    {
        try
        {
            var curPortNames = System.IO.Ports.SerialPort.GetPortNames();
            return curPortNames;
        }
        catch (Exception ex)
        {
            return Enumerable.Empty<string>().ToArray();
        }
    }

    private static string[] _serialPortNames;
    private static ManagementEventWatcher _arrival;
    private static ManagementEventWatcher _removal;
    public static IEnumerable<string> SerialPortNames
    {
        get { return _serialPortNames; }
    }

    public static event EventHandler<SerialPortsChangedEventArgs> SerialPortsChanged;
}
原文地址:https://www.cnblogs.com/wesson2019-blog/p/12218447.html