winformsアプリケーションは、メーカーのSDKを使用してカスタムコントローラをサポートしていますが、デバイスが存在するかどうかを検出するサポートはありません。特定のUSBデバイスが接続されているかどうかを確認するにはどうすればよいですか?特定のUSBデバイスが接続されているかどうかを確認するにはどうすればよいですか?
10
A
答えて
6
次のクラスを使用してデバイスを監視します。これを使用して、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
}
}
+6
このコードがあなたのものでない場合は、帰属をお願いします。 http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/09912cee-4d2d-4efd-82a0-da20024b868bから直接リッピングされたようですが、それは存在していたケーシング間違いそこ。 – SqlRyan
+0
残念ながら、上記の方法は非常に遅いです。私のPC上では〜4秒かかる –
関連する問題
- 1. デバイスがウェブに接続されているかどうかを確認する
- 2. デバイスが電源、USBまたはDockに接続されているかどうかを確認する方法
- 3. USBスロットにどのデバイスが接続されているかを特定するにはどうすればよいですか?
- 4. 指定したJIDがすでにサーバーに接続されているかどうかを確認するにはどうすればよいですか?
- 5. アンドロイドでインターネット接続しているAndroidデバイスを確認するにはどうすればいいですか?
- 6. 特定のユーザーがインターネットに接続しているかどうかを確認するにはどうすればよいですか?
- 7. UWP - ローカルネットワークをスキャンして、どのデバイスが接続されているかを確認するにはどうすればよいですか?
- 8. Android:Bluetoothがどのデバイスに接続されているかどうかを確認してください。
- 9. iOSでデバイス設定の振動モードがプログラムで設定されているかどうかを確認するにはどうすればよいですか?
- 10. Elasticsearchへの接続が確立されているかどうかを確認するにはどうすればよいですか?
- 11. iOSデバイスをカスタムUSBデバイスに接続するにはどうすればよいですか?
- 12. デバイスがルータに接続されている場合のインターネット接続の可用性を確認するにはどうすればよいですか?
- 13. 接続が測定されているかどうかを確認するにはどうすればよいですか?
- 14. HttpWebRequest&Long Polling:ロングポーリング接続が確立されているかどうかを確認するにはどうすればよいですか?
- 15. ユーザーにマイクが接続されているかどうかを確認する
- 16. ソケットがすでにサーバーに接続されているかどうかを確認するにはどうすればよいですか?
- 17. アンドロイドでWiFi adbが接続または切断されているかどうかをプログラムで確認するにはどうすればよいですか?
- 18. 特定のUSBデバイス(ストレージデバイスではない)がバッチスクリプトでWindowsに接続されているかどうかを確認するにはどうすればよいですか?
- 19. AndroidでHDMIデバイスの接続状態を確認するにはどうすればよいですか?
- 20. アラートダイアログインターネットに接続されているかどうか再確認するには
- 21. デバイスがアクティブなWiFi接続を介してインターネットにアクセスできるかどうかを確認するにはどうすればよいですか?
- 22. ネットワークアダプタがWinPCapと有線または無線で接続されているかどうかを確認するにはどうすればよいですか?
- 23. 回答セットプログラミングを使用してグラフが強く接続されているかどうかを確認するにはどうすればよいですか?
- 24. クライアントがTCPでTCP接続されていないかどうかを確認するにはどうすればよいですか?
- 25. Bluetoothが接続されているかどうかを確認する
- 26. MQが接続されているかどうかを確認する方法
- 27. 接続でsslが使用されているかどうかを確認するにはどうすればよいですか?
- 28. AndroidでBluetoothヘッドセットが接続されているかどうかを確認するにはどうすればよいですか?
- 29. ソケットが現在Javaで接続されているかどうかを確認するにはどうすればよいですか?
- 30. 周辺機器がGPIOに接続されているかどうかを確認するにはどうすればよいですか?
ポーリングUSBシステムから抽出
? – dusoft