C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

USB接続の検出方法

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■93016 / inTopicNo.1)  USB接続の検出方法
  
□投稿者/ じょこびっち (25回)-(2019/11/14(Thu) 14:45:04)

分類:[C#] 

USBで接続している特定のデバイスが電源OFF、またはUSBが抜けてしまった時に「接続が切れました」的なメッセージを出したいのですが、どのようにしたらUSBの接続が外れたり差し込まれたりの検出ができるのでしょうか?
調べてみてもManagementScopやらManagementEventWatcherやらEventArrivedEventHandlerやら、メインフォームに書くのか、クラスを新しく作るのかもよくわかりませんでした。
よろしくお願いします。
引用返信 編集キー/
■93017 / inTopicNo.2)  Re[1]: USB接続の検出方法
□投稿者/ 魔界の仮面弁士 (2481回)-(2019/11/14(Thu) 15:11:02)
2019/11/14(Thu) 15:16:11 編集(投稿者)

No93016 (じょこびっち さん) に返信
> どのようにしたらUSBの接続が外れたり差し込まれたりの検出ができるのでしょうか?

過去ログとしては No66415 , No78061 , No91134 あたりでしょうか。
WndProc メソッドをオーバーライドして、WM_DEVICECHANGE メッセージ (0x219) を捉えたら拾えるかも。
OS 側でデバイスとして認識されない、給電目的で繋がれるデバイスなどは駄目でしょうけれど…。


> USBで接続している特定のデバイスが電源OFF、またはUSBが抜けてしまった時に

ここで想定しているデバイスはどういったものでしょうか。

USB 接続されるデバイスとしては、電力線利用の LED ライトや扇風機とかもありますし、
USB-PD で PC 側に電力供給するための AC 電源などもあります。


電源 OFF という点だけ見ると、USB マウス や USB キーボード といった HID 系では無さそう。
モバイルハードディスクや光学ディスクドライブ、スピーカー、USB ハブ、
USB モニターなどについては、スイッチのあるものと無いものがありますが、
USB 接続の LAN や USB メモリー、カードリーダー等は、電源スイッチは
付いていないものしか見たことが無いです。

電源スイッチのある可能性が高そうなデバイスとしては、プリンターとか、
USB 接続の Wi-Fi ルーターとか、ビデオカメラなど…?
引用返信 編集キー/
■93023 / inTopicNo.3)  Re[2]: USB接続の検出方法
□投稿者/ じょこびっち (26回)-(2019/11/15(Fri) 09:16:24)
No93017 (魔界の仮面弁士 さん) に返信
>
> 過去ログとしては No66415 , No78061 , No91134 あたりでしょうか。
> WndProc メソッドをオーバーライドして、WM_DEVICECHANGE メッセージ (0x219) を捉えたら拾えるかも。
> OS 側でデバイスとして認識されない、給電目的で繋がれるデバイスなどは駄目でしょうけれど…。

WM_DEVICECHANGEは捉える事が出来ました。
でも、DBT_DEVICEARRIVALやDBT_DEVICEREMOVECOMPLETEは捉えられません。
ちなみにDBT_DEVICEARRIVALをDBT_DEVNODES_CHANGED(0x0007)に書き換えたら捉えられました。
DBT_DEVICEARRIVALやDBT_DEVICEREMOVECOMPLETEは無理なのでしょうか?

protected override void WndProc(ref Message m)
{
if (m.Msg == 0x219)
{
if (m.WParam.ToInt32() == 0x8000)
{
MessageBox.Show("8000");
}
else if (m.WParam.ToInt32() == 0x8004)
{
MessageBox.Show("8004");
}
}
base.WndProc(ref m);
}


> ここで想定しているデバイスはどういったものでしょうか。
>
> 電源スイッチのある可能性が高そうなデバイスとしては、プリンターとか、
> USB 接続の Wi-Fi ルーターとか、ビデオカメラなど…?

オシロスコープです。
USBにオシロがつながっているなどの特定は難しいのでしょうか?
引用返信 編集キー/
■93024 / inTopicNo.4)  Re[3]: USB接続の検出方法
□投稿者/ みい (108回)-(2019/11/15(Fri) 09:25:01)
オシロなら測定以外の状態取得やバージョン取得のコマンド(関数)はありませんか?
応答がなかったら切断とみなし、切断されたら成功するまで定期的に接続を試みるとか。

引用返信 編集キー/
■93026 / inTopicNo.5)  Re[4]: USB接続の検出方法
□投稿者/ じょこびっち (27回)-(2019/11/15(Fri) 09:48:49)
2019/11/15(Fri) 10:00:19 編集(投稿者)

No93024 (みい さん) に返信
> オシロなら測定以外の状態取得やバージョン取得のコマンド(関数)はありませんか?
> 応答がなかったら切断とみなし、切断されたら成功するまで定期的に接続を試みるとか。

みいさん。
そうなんですよね。それは念頭にあるんですよ。
WM_DEVICECHANGEを捉えたらコマンドを送って接続状況を判断する。
しかし、せっかくなので更に詳しい事も知っておければ後で役に立ちますし、コードを書く時に色んな判断が出来ると思っています。
アドバイスしていただいたのに申し訳ありません。
引用返信 編集キー/
■93028 / inTopicNo.6)  Re[5]: USB接続の検出方法
□投稿者/ とっちゃん (642回)-(2019/11/15(Fri) 10:30:45)
No93026 (じょこびっち さん) に返信

> WM_DEVICECHANGEを捉えたらコマンドを送って接続状況を判断する。
> しかし、せっかくなので更に詳しい事も知っておければ後で役に立ちますし、コードを書く時に色んな判断が出来ると思っています。
> アドバイスしていただいたのに申し訳ありません。

Device管理系はまずはここのページを読むところからかなぁ。。。

・Device Management(Mirosoft Docs)
https://docs.microsoft.com/en-us/windows/win32/devio/device-management?WT.mc_id=DT-MVP-32182

接続したデバイスとのやり取りは機械固有のやり取りが基本になりますが、そうではなく全般となるとまたいろいろと違ってきます。
RegisterDeviceNotification もきちんと対象となるインターフェースを指定しておけばかなりいろんな情報を通知してもらえるはずです。

引用返信 編集キー/
■93029 / inTopicNo.7)  Re[6]: USB接続の検出方法
□投稿者/ じょこびっち (28回)-(2019/11/15(Fri) 13:16:30)
No93028 (とっちゃん さん) に返信
>
> 接続したデバイスとのやり取りは機械固有のやり取りが基本になりますが、そうではなく全般となるとまたいろいろと違ってきます。
> RegisterDeviceNotification もきちんと対象となるインターフェースを指定しておけばかなりいろんな情報を通知してもらえるはずです。
>
少し読んで気が付いたのですが、USBメモリを抜き差ししたら
No93023のコードでDBT_DEVICEARRIVALとDBT_DEVICEREMOVECOMPLETEは捉えられました。
オシロスコープだけ捉えられませんでした。
てことはRegisterDeviceNotificationでオシロスコープを指定すれば(何をどう指定するの?)いいって事ですか?
あまり理解出来てないので抵当な事を言ってしまっているかもですが。。。
引用返信 編集キー/
■93030 / inTopicNo.8)  Re[7]: USB接続の検出方法
□投稿者/ じょこびっち (29回)-(2019/11/15(Fri) 13:42:15)
このサイトに記載されているコードを試したらできました。
https://stackoverflow.com/questions/1976573/using-registerdevicenotification-in-a-net-app

とっちゃんさんのおっしゃる通りRegisterDeviceNotificationを使っていますね。
これから解析して理解してみたいと思います。

魔界の仮面弁士さん、みいさん、とっちゃんさん
アドバイスありがとうございました。
次回もよろしくお願いします。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ