Nuestra aplicación winforms admite un controlador personalizado utilizando el SDK del fabricante, pero no hay soporte para detectar si un dispositivo está presente o no. ¿Cómo verifico si un dispositivo USB dado está enchufado?¿Cómo verifico si un dispositivo USB dado está enchufado?
Respuesta
La siguiente clase se utiliza para monitorear dispositivos, puede usar esto para detectar un dispositivo 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
}
}
Editar
extraído de sistema USB http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/09912cee-4d2d-4efd-82a0-da20024b868b
SI este código no es suyo, por favor proporcione una atribución. Parece que fue arrancado directamente de http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/09912cee-4d2d-4efd-82a0-da20024b868b, ya que incluso contiene un error de la carcasa que estaba presente ahí. – SqlRyan
Lamentablemente, el método anterior es muy lento. En mi pc toma ~ 4 segundos –
- 1. Cómo verifico si el escáner está enchufado (C#, .NET TWAIN)
- 2. ¿Cómo verifico si un dispositivo está ejecutando iOS 6?
- 3. ¿Cómo saber cuándo el dispositivo iOS está enchufado?
- 4. Detectando que el dispositivo está enchufado
- 5. ¿Cómo detectar usando C# si un pendrive está enchufado a un puerto USB?
- 6. Cómo identificar un dispositivo USB dado su VID y PID
- 7. ¿Cómo verifico si un repositorio está vacío?
- 8. ¿Cómo verifico si un valor dado es una lista genérica?
- 9. ¿Cómo verifico si un objeto datetime dado está "entre" dos fechas y horas?
- 10. ¿Cómo saber a qué puerto está conectado un dispositivo USB?
- 11. Dispositivo USB conectado
- 12. ¿Cómo verifico si una clase está definida?
- 13. Detecta cuando un dispositivo USB está conectado en C
- 14. ¿Cómo puedo determinar si un dispositivo USB conectado es una unidad flash USB?
- 15. ¿Cómo verifico si un MSI particular está instalado?
- 16. ¿Cómo comunicarse con un dispositivo USB?
- 17. ¿Cómo verifico si stdin tiene algunos datos?
- 18. Simular un dispositivo USB para automatización
- 19. ¿Cómo verifico si una variable Smarty ya está asignada?
- 20. Cómo verifico si el usuario está conectado en Javascript
- 21. Cómo verifico si Debug está habilitado en web.config
- 22. Cómo saber si el dispositivo está durmiendo
- 23. Dispositivo USB HID con Android
- 24. Hacer un dispositivo USB, controlarlo En Java
- 25. Linux: Cómo asignar controlador USB al dispositivo
- 26. ¿Cómo puedo vincular un controlador con un dispositivo USB?
- 27. ¿Cómo determinar si un dispositivo Android está rooteado programáticamente?
- 28. ¿Cómo encontrar qué dispositivo está conectado a un puerto serie USB en Linux usando C?
- 29. ¿Cómo puedo comunicarme con un dispositivo USB HID en Delphi
- 30. ¿Cómo implementar un controlador de dispositivo USB para Windows?
encuesta? – dusoft