Nasza aplikacja WinForm obsługuje niestandardowy kontroler używający SDK producenta, ale nie ma możliwości sprawdzenia, czy urządzenie jest obecne, czy nie. Jak sprawdzić, czy dane urządzenie USB jest podłączone?Jak sprawdzić, czy dane urządzenie USB jest podłączone?
Odpowiedz
Do monitorowania urządzeń służy następująca klasa, której można użyć do wykrycia urządzenia 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
}
}
Edit
Wyciąg z systemu usb http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/09912cee-4d2d-4efd-82a0-da20024b868b
JEŻELI ten kod nie należy do Ciebie, proszę podać źródła. Wygląda na to, że została zgrana bezpośrednio z http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/09912cee-4d2d-4efd-82a0-da20024b868b, ponieważ zawiera nawet błąd obudowy, który był obecny tam. – SqlRyan
Niestety powyższa metoda jest bardzo powolna. Na moim komputerze zajmuje to około 4 sekundy –
- 1. Jak sprawdzić, czy urządzenie iOS jest podłączone?
- 2. Jak określić, czy podłączone urządzenie USB jest dyskiem flash USB?
- 3. Jak mogę sprawdzić, czy urządzenie peryferyjne jest podłączone do GPIO?
- 4. Jak sprawdzić, czy nowe urządzenie pamięci masowej USB jest podłączone w Qt?
- 5. Wykryj, kiedy urządzenie USB jest podłączone w C
- 6. Wykrywanie, czy urządzenie używa USB 3.0
- 7. udev: urządzenie podłączone podczas rozruchu
- 8. Jak sprawdzić, czy gniazdo JZMQ jest podłączone?
- 9. Jak sprawdzić, czy mój program ma podłączone do niego dane
- 10. com.android.ddmlib.AdbCommandRejectedException: urządzenie w trybie offline (nawet gdy urządzenie jest podłączone)
- 11. Jak sprawdzić, czy urządzenie jest Ipad mini
- 12. Jak sprawdzić urządzenie USB za pomocą instrukcji bash
- 13. Jak pobierać i pobierać dane z urządzenia USB za pomocą MTP (Urządzenie nie jest aparatem)
- 14. Jak rozpoznać urządzenie pamięci USB UNIQUELY?
- 15. Jak mogę uruchomić urządzenie USB z C#?
- 16. Jak mogę uzyskać wszystkie podłączone dyski USB (w)
- 17. C# wykryj urządzenie USB ClassCode (typ urządzenia USB)
- 18. Jak sprawdzić, czy skaner jest podłączony (C#, .NET TWAIN)?
- 19. Jak sprawdzić, czy sdcard jest zamontowany w systemie Android?
- 20. Czy można odsłonić urządzenie USB do kontenera LXC/Docker?
- 21. Podłącz urządzenie USB do emulatora Androida?
- 22. Port USB na port szeregowy
- 23. Jak wykryć, że urządzenie z Androidem jest połączone z USB OTG lub nie programowo
- 24. Jak sprawdzić, czy Android "Mobilne dane" jest na
- 25. Jak sprawdzić, czy jest konsola?
- 26. Dane wysyłania/odbierania urządzenia USB
- 27. Jak sprawdzić, czy iPhone jest zablokowany?
- 28. Android - Jak sprawdzić, czy urządzenie obsługuje tylko Wi-Fi?
- 29. iPhone itp: jak sprawdzić, czy urządzenie ma kamerę?
- 30. Jak sprawdzić, czy urządzenie z Androidem ma twarde klucze?
sondzie? – dusoft