如何在C#winform中检测USB设备类别的插入情况? [英] How do I detect insertion of USB devices category wise in C# winform?

查看:106
本文介绍了如何在C#winform中检测USB设备类别的插入情况?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

USB thumb drives
USB harddisks
USB DVD writer
USB Bluetooth devices
USB headsets
usb mouse
USB keyboard
USB webcams / cameras

只想使用事件处理程序检测任何类型的USB设备...不胜感激...

Just want to detect any sort of usb device using event handler... Would appreciate any help...

WqlEventQuery q_creation = new WqlEventQuery();
 private void Form2_Load(object sender, EventArgs e)
        {



            q_creation.EventClassName = "__InstanceCreationEvent";
            q_creation.WithinInterval = new TimeSpan(0, 0, 2);    //How often do you want to check it? 2Sec.
            q_creation.Condition = @"TargetInstance ISA 'Win32_DiskDriveToDiskPartition'";
            var mwe_creation = new ManagementEventWatcher(q_creation);
            mwe_creation.EventArrived += new EventArrivedEventHandler(USBEventArrived_Creation);
            mwe_creation.Start(); // Start listen for events
}                                                                                    
 /// <summary>
        /// Callback event
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        internal void USBEventArrived_Creation(object sender, EventArrivedEventArgs e)
        {
            MessageBox.Show("Device Connected");
        }

这是我尝试过的代码.

推荐答案

我正在为您粘贴整个类,按原样使用(将事件挂在底部以检测或删除USB):

I am pasting my entire class for you, use as is (hookup the events right at the bottom for detecting or removal of USB) :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Management;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace BlueMercs.Core.Services.WMI
{

  public class EventUsbMonitorEvent : EventArgs
  {
    public string Model { get; set; }
    public string Drive { get; set; }
  }

  public class UsbMonitor
  {
    private const string _queryForEvents = @"SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_DiskDrive'";
    private string _queryDiskPartitionDevice = "ASSOCIATORS OF {Win32_DiskDrive.DeviceID=\"{0}\"} WHERE AssocClass = Win32_DiskDriveToDiskPartition";
    private string _queryDiskLogicalPartition = "ASSOCIATORS OF {Win32_DiskPartition.DeviceID=\"{0}\"} WHERE AssocClass = Win32_LogicalDiskToPartition";



    private readonly ManagementEventWatcher _watcher;
    private Thread _thread;

    public UsbMonitor()
    {
      _watcher = new ManagementEventWatcher();
      var query = new WqlEventQuery(_queryForEvents);
      _watcher.EventArrived += Watcher_EventArrived;
      _watcher.Query = query;
    }

    public void Start()
    {
      _watcher.Start();
      _thread = new Thread(Listen);
      _thread.Start();
    }

    public void Stop()
    {
      try { _thread.Abort(); } catch { } //suppress thread abort exception
      _watcher.Stop();
    }

    private void Listen()
    {
      _watcher.WaitForNextEvent();
      Listen();
    }

    private string GetDriveLetterFromDisk(string name)
    {
      name = name.Replace(@"\", @"\\");
      var driveLetter = string.Empty;
      var qryPartition = new ObjectQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=\"" + name + "\"} WHERE AssocClass = Win32_DiskDriveToDiskPartition"); //string.Format(_queryDiskPartitionDevice, name));
      var partition = new ManagementObjectSearcher(qryPartition);

      foreach (var result in partition.Get())
      {
        //var qryLogicalDisk = new ObjectQuery(string.Format(_queryDiskLogicalPartition, result["DeviceID"]));
        var logicalDisk = new ManagementObjectSearcher("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=\"" + result["DeviceID"] + "\"} WHERE AssocClass = Win32_LogicalDiskToPartition"); //qryLogicalDisk);
        driveLetter = logicalDisk.Get().Cast<ManagementBaseObject>().Aggregate(driveLetter, (current, x) => current + (x["Name"] + ","));
      }

      return driveLetter.Trim(',');
    }

    private void Watcher_EventArrived(object sender, EventArrivedEventArgs e)
    {
      ManagementBaseObject targetInstance;

      switch (e.NewEvent.ClassPath.ClassName)
      {
        case "__InstanceCreationEvent":
          targetInstance = (ManagementBaseObject)e.NewEvent["TargetInstance"];
          if (targetInstance["InterfaceType"].ToString() == "USB")
          {
            var driveName = targetInstance["Caption"].ToString();
            var driveLetter = GetDriveLetterFromDisk(targetInstance["Name"].ToString());
            if (OnExternalUsbDetected != null)
              OnExternalUsbDetected(this, new EventUsbMonitorEvent { Model = driveName, Drive = driveLetter });
          }
          break;

        case "__InstanceDeletionEvent":
          targetInstance = (ManagementBaseObject)e.NewEvent["TargetInstance"];
          if (targetInstance["InterfaceType"].ToString() == "USB")
          {
            var driveName = targetInstance["Caption"].ToString();
            var driveLetter = GetDriveLetterFromDisk(targetInstance["Name"].ToString());
            if (OnExternalUsbRemoved != null)
              OnExternalUsbRemoved(this, new EventUsbMonitorEvent { Model = driveName, Drive = driveLetter });
          }
          break;
      }
    }

    public event EventHandler<EventUsbMonitorEvent> OnExternalUsbDetected;
    public event EventHandler<EventUsbMonitorEvent> OnExternalUsbRemoved;
  }
}

这篇关于如何在C#winform中检测USB设备类别的插入情况?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆