ながれです。
今回はC#の外部デバイス接続・切断検知の方法についてお話していきます。
外部デバイスの接続や切断を検知したい場面って結構ありませんか?
USBカメラ、マイク、マウス、その他諸々。
ループを回して、DeviceInformationクラスで一致する名前のデバイスを監視するのも良いですが、相当CPU負荷が上がります。
今回ご紹介するのは、ループ監視をしなくてもデバイス接続・切断を検知してくれる方法です。
是非最後までご覧ください!
DeviceWatcherクラス
Windows.Devices.EnumerationのDeviceWatcherクラスで、外部デバイスの接続・切断検知が可能です。
public sealed class DeviceWatcher
デバイスが動的に列挙されるため、最初の列挙が完了した後にデバイスが追加、削除、または変更された場合にアプリが通知を受け取ります。
使い方は以下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public DeviceWatcher DeviceWatcher => deviceWatcher; public void StartWatcher(DeviceWatcher deviceWatcher) { this.deviceWatcher = deviceWatcher; // 各ハンドラを追加 // デバイス接続検知 deviceWatcher.Added += Watcher_DeviceAdded; // デバイス更新検知 deviceWatcher.Updated += Watcher_DeviceUpdated; // デバイス切断検知 deviceWatcher.Removed += Watcher_DeviceRemoved; // デバイス列挙完了 deviceWatcher.EnumerationCompleted += Watcher_EnumerationCompleted; // デバイス監視終了 deviceWatcher.Stopped += Watcher_Stopped; // デバイス監視開始 deviceWatcher.Start(); } |
上記でDeviceWatcherを使う準備は完了です。
Unity VR 超入門 : Unity と C# をゼロから学んで5つの VR ゲーム を作ってみよう
Watcher_DeviceAdded,Watcher_DeviceUpdated,Watcher_DeviceRemoved,Watcher_EnumerationCompleted,Watcher_Stoppedはメソッド名です。各イベント発生時に行う処理をメソッド内に追加してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
private async void Watcher_DeviceAdded(DeviceWatcher sender, DeviceInformation deviceInfo) { // デバイス接続検知時に行う処理 } private async void Watcher_DeviceUpdated(DeviceWatcher sender, DeviceInformationUpdate deviceInfoUpdate) { // デバイス更新検知時に行う処理 } private async void Watcher_DeviceRemoved(DeviceWatcher sender, DeviceInformationUpdate deviceInfoUpdate) { // デバイス切断検知時に行う処理 } private async void Watcher_EnumerationCompleted(DeviceWatcher sender, object obj) { // デバイス列挙完了時に行う処理 } private async void Watcher_Stopped(DeviceWatcher sender, object obj) { // デバイス監視終了時に行う処理 } |
各メソッドの引数で、デバイスのデバイス名・VenderID・ProductIDなどが取得できるため、必要に応じて取得して処理を行ってください。
ただし、引数の「deviceInfoUpdate」は直接VenderIDやProductIDが取得できないです。
deviceInfoUpdateで取得できる文字列内にVenderIDやProductIDが含まれているので、IndexOfメソッドやContainsメソッドで指定のVenderID,ProductIDが含まれているかを判断してください。
デバイス接続時は
Added,Updated,EnumerationCompleted
デバイス切断時は
Removed,Updated,EnumerationCompleted
のイベント通知があった(はず…)です。
まとめ
外部デバイスの接続・切断検知はDeviceWatcherクラスを利用してください。
デバイスの列挙と監視は、DeviceWatcherクラスを利用することをMicrosoftも推奨しています。
以上です。
MicrosoftのWindowsデベロッパーの情報ってすごい見にくいですよねー…