Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WinC窗体中按类别检测USB设备的插入?_C#_Winforms_Callback_Usb_Managementeventwatcher - Fatal编程技术网

C# 如何在WinC窗体中按类别检测USB设备的插入?

C# 如何在WinC窗体中按类别检测USB设备的插入?,c#,winforms,callback,usb,managementeventwatcher,C#,Winforms,Callback,Usb,Managementeventwatcher,只是想检测任何类型的usb设备使用事件处理程序。。。 非常感谢您的帮助 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 WqlEventQue

只是想检测任何类型的usb设备使用事件处理程序。。。 非常感谢您的帮助

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上,使用它你可以访问任何东西。告诉我们你已经尝试了一些东西,并且没有懒得搜索答案。事实上,我在谷歌上搜索过,也尝试过,我的代码也只检测pendrive。可能会有帮助。它帮助了我。该代码还检测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;
  }
}