gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:12:17 24 4
gpt4 key购买 nike

我们的 winforms 应用程序支持使用制造商的 SDK 的自定义 Controller ,但不支持检测设备是否存在。如何检查给定的 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, 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

关于c# - 如何检查给定的 USB 设备是否已插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1048940/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com