【问题标题】:How do I detect insertion of USB devices category wise in C# winform?如何在 C# winform 中检测 USB 设备类别的插入?
【发布时间】:2015-09-08 12:50:26
【问题描述】:
USB thumb drives
USB harddisks
USB DVD writer
USB Bluetooth devices
USB headsets
usb mouse
USB keyboard
USB webcams / cameras

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

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");
        }

这是我尝试过的代码。

【问题讨论】:

  • 这只检测笔式驱动器。不检测鼠标和其他设备
  • 但这对于您的问题来说是一个很好的起点,不是吗?这意味着您需要花一些时间在谷歌上搜索 WMI,使用它您可以访问任何内容。向我们表明您已经尝试过某些事情并且不会懒得去寻找答案
  • 其实我在google里搜过也试过了,我的代码也只检测pendrive。
  • 可能是this 会有所帮助。它帮助了我。

标签: c# winforms callback usb managementeventwatcher


【解决方案1】:

我正在为你粘贴我的整个课程,按原样使用(在底部连接事件以检测或移除 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;
  }
}

【讨论】:

  • 此代码也在检测 USB 随身碟,即使没有检测到通过数据线连接的手机,也没有检测到其他设备
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-16
  • 2014-10-15
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多