c# – 如何检查给定的USB设备是否已插入?

前端之家收集整理的这篇文章主要介绍了c# – 如何检查给定的USB设备是否已插入?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们的 winforms应用程序支持使用制造商SDK的自定义控制器,但不支持检测设备是否存在.如何检查给定的USB设备是否已插入?

解决方法

以下类用于监视设备,您可以使用它来检测USB设备.
using System;
using System.Collections.Generic;
using System.Text;
using System.Management;

namespace DeviceMonitor.Event
{
    /// <summary>Media watcher delegate.</summary>
    /// <param name="sender"></param>
    /// <param name="driveStatus"></param>
    public delegate void MediaWatcherEventHandler(object sender,DeviceMonitor.Event.MediaEvent.DriveStatus driveStatus );

    /// <summary>Class to monitor devices.</summary>
    public class MediaEvent
    {
        #region Variables

        /*------------------------------------------------------------------------*/
        private string m_logicalDrive;
        private ManagementEventWatcher m_managementEventWatcher = null;
        /*------------------------------------------------------------------------*/
        #endregion

        #region Events
        /*------------------------------------------------------------------------*/
        public event MediaWatcherEventHandler MediaWatcher;
        /*------------------------------------------------------------------------*/
        #endregion


        #region Enums
        /*------------------------------------------------------------------------*/
        /// <summary>The drive types.</summary>
        public enum DriveType
        {
          Unknown = 0,NoRootDirectory = 1,RemoveableDisk  = 2,LocalDisk       = 3,NetworkDrive    = 4,CompactDisk     = 5,RamDisk         = 6
        }

        /// <summary>The drive status.</summary>
        public enum DriveStatus
        {
          Unknown  = -1,Ejected  = 0,Inserted = 1,}

       /*-----------------------------------------------------------------------*/
       #endregion


       #region Monitoring
       /*-----------------------------------------------------------------------*/
       /// <summary>Starts the monitoring of device.</summary>
       /// <param name="path"></param>
       /// <param name="mediaEvent"></param>
       public void Monitor( string path,MediaEvent mediaEvent ) 
       {
           if( null == mediaEvent ) 
           {
              throw new ArgumentException( "Media event cannot be null!" );
           }

           //In case same class was called make sure only one instance is running
           /////////////////////////////////////////////////////////////
           this.Exit();

           //Keep logica drive to check
           /////////////////////////////////////////////////////////////
           this.m_logicalDrive = this.GetLogicalDrive( path );

           WqlEventQuery wql;
           ManagementOperationObserver observer = new ManagementOperationObserver();

           //Bind to local machine
           /////////////////////////////////////////////////////////////
           ConnectionOptions opt = new ConnectionOptions();

           //Sets required privilege
           /////////////////////////////////////////////////////////////
           opt.EnablePrivileges = true;
           ManagementScope scope = new ManagementScope( "root\\CIMV2",opt );

           try 
           {
              wql = new WqlEventQuery();
              wql.EventClassName = "__InstanceModificationEvent";
              wql.WithinInterval = new TimeSpan( 0,1 );

              wql.Condition = String.Format( @"TargetInstance ISA 'Win32_LogicalDisk' and TargetInstance.DeviceId = '{0}'",this.m_logicalDrive );
              this.m_managementEventWatcher = new ManagementEventWatcher( scope,wql );

              //Register async. event handler
              /////////////////////////////////////////////////////////////
              this.m_managementEventWatcher.EventArrived += new EventArrivedEventHandler( mediaEvent.MediaEventArrived );
              this.m_managementEventWatcher.Start();
           } 
           catch( Exception e ) 
           {
              this.Exit();
              throw new Exception( "Media Check: "  + e.Message );
           }
       }

       /// <summary>Stops the monitoring of device.</summary>
       public void Exit( ) 
       {
             //In case same class was called make sure only one instance is running
             /////////////////////////////////////////////////////////////
             if( null != this.m_managementEventWatcher ) 
             {
                  try 
                  {
                       this.m_managementEventWatcher.Stop();
                       this.m_managementEventWatcher = null;
                  } 
                  catch {}
             }
        }
        /*-----------------------------------------------------------------------*/
        #endregion


        #region Helpers
        /*-----------------------------------------------------------------------*/

        private DriveStatus m_driveStatus = DriveStatus.Unknown;

        /// <summary>Triggers the event when change on device occured.</summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MediaEventArrived( object sender,EventArrivedEventArgs e ) 
        {

            // Get the Event object and display it
            PropertyData pd = e.NewEvent.Properties["TargetInstance"];
            DriveStatus driveStatus = this.m_driveStatus;

            if( pd != null ) 
            {
                ManagementBaSEObject mbo = pd.Value as ManagementBaSEObject;
                System.IO.DriveInfo info = new System.IO.DriveInfo( (string)mbo.Properties["DeviceID"].Value );
                driveStatus = info.IsReady ? DriveStatus.Inserted : DriveStatus.Ejected;
            }

            if( driveStatus != this.m_driveStatus )
            {
                this.m_driveStatus = driveStatus;
                if( null != MediaWatcher ) 
                {
                    MediaWatcher( sender,driveStatus );
                }
            }
        }


        /// <summary>Gets the logical drive of a given path.</summary>
        /// <param name="path"></param>
        /// <returns></returns>
        private string GetLogicalDrive( string path ) 
        {
            System.IO.DirectoryInfo dirInfo = new System.IO.DirectoryInfo( path );
            string root = dirInfo.Root.FullName;
            string logicalDrive = root.Remove(root.IndexOf(System.IO.Path.DirectorySeparatorChar ) );
            return logicalDrive;
        }
        /*-----------------------------------------------------------------------*/
        #endregion
    }
}

编辑

摘自http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/09912cee-4d2d-4efd-82a0-da20024b868b

原文链接:https://www.f2er.com/csharp/96285.html

猜你在找的C#相关文章