c# – 如何检查给定的USB设备是否已插入?
发布时间:2020-12-15 18:11:07 所属栏目:百科 来源:网络整理
导读:我们的 winforms应用程序支持使用制造商SDK的自定义控制器,但不支持检测设备是否存在.如何检查给定的USB设备是否已插入? 解决方法 以下类用于监视设备,您可以使用它来检测USB设备. using System;using System.Collections.Generic;using System.Text;using
我们的
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( "rootCIMV2",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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |