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

わんくま同盟

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

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

ツリー一括表示

USBポートのどの口にUSBメモリが挿入されたかを認識したい /ぼーちゃん (25/02/13(Thu) 08:53) #103539
Re[1]: USBポートのどの口にUSBメモリが挿入されたかを認識し.. /魔界の仮面弁士 (25/02/13(Thu) 11:47) #103540
  └ Re[2]: USBポートのどの口にUSBメモリが挿入されたかを認識し.. /ぼーちゃん (25/02/13(Thu) 11:57) #103541
    └ Re[3]: USBポートのどの口にUSBメモリが挿入されたかを認識し.. /ぼーちゃん (25/02/14(Fri) 11:21) #103543 解決済み
      └ (削除) / (25/02/19(Wed) 12:20) #103561
        └ Re[5]: (削除) /とっちゃん (25/02/21(Fri) 13:02) #103563 解決済み


親記事 / ▼[ 103540 ]
■103539 / 親階層)  USBポートのどの口にUSBメモリが挿入されたかを認識したい
□投稿者/ ぼーちゃん (1回)-(2025/02/13(Thu) 08:53:11)

分類:[C#] 

いつも参考にさせていただいております

Visual Studio Professional 2022
.NET Framework 4.8
C#
Windows10向け

◆やりたいこと
開発中のWinFormsアプリで、PCに複数あるUSBポートのどの口にUSBメモリが挿入されたかを認識したいです。
(XY問題かとも思い代案もユーザーへ提案したのですが、必須とのことで実装したく)

PCのあるUSBポートにUSBメモリを挿入した時「Port3に接続」とメッセージを出す
PCの別のUSBポートにUSBメモリを挿入した時「Port5に接続」とメッセージを出す
※ポート番号は例で、区別が出来ればよい


◆調べたこと
https://infinitegra.co.jp/blog/usb-device-tree-viewer/
このURLのツール(USB Device Tree Viewer)を使うとUSBルートハブ以下にPort1, Port2...とポートが列挙され、
この状態でUSBメモリを接続すると対応するPort以下のツリーにUSB情報が表示されます。
この情報をC#で取れればいいのですが・・・

https://www.projectgroup.info/tips/Microsoft.NET/comm_0013.html
こちらを参考にUSBメモリのデバイスIDなどは取得できているので、
同様にManagementObjectのPropertyの中に親ポートの情報が無いかと
色々検索しているのですが見つかっていない状況です。
方向性が間違っているでしょうか。取っ掛かりだけでもアドバイスを頂けると幸いです。
[ □ Tree ] 返信 編集キー/

▲[ 103539 ] / ▼[ 103541 ]
■103540 / 1階層)  Re[1]: USBポートのどの口にUSBメモリが挿入されたかを認識したい
□投稿者/ 魔界の仮面弁士 (3822回)-(2025/02/13(Thu) 11:47:07)
2025/02/13(Thu) 11:48:21 編集(投稿者)

No103539 (ぼーちゃん さん) に返信
> こちらを参考にUSBメモリのデバイスIDなどは取得できているので、
> 同様にManagementObjectのPropertyの中に親ポートの情報が無いかと
> 色々検索しているのですが見つかっていない状況です。
WMI からでは情報を得られないと思います。
CIM_USBHub.NumberOfPorts とかも値を返してくれないので…。

> https://infinitegra.co.jp/blog/usb-device-tree-viewer/
> このURLのツール(USB Device Tree Viewer)を使うとUSBルートハブ以下にPort1, Port2...とポートが列挙され、
そのツールの元になった、Microsoft USBView sample コードが下記にあります。
https://learn.microsoft.com/en-us/samples/microsoft/windows-driver-samples/usbview-sample-application/?WT.mc_id=DT-MVP-8907
https://github.com/microsoft/windows-driver-samples/tree/main/usb/usbview

関連情報
https://stackoverflow.com/questions/6416931/can-the-physical-usb-port-be-identified-programmatically-for-a-device-in-windows
[ 親 103539 / □ Tree ] 返信 編集キー/

▲[ 103540 ] / ▼[ 103543 ]
■103541 / 2階層)  Re[2]: USBポートのどの口にUSBメモリが挿入されたかを認識したい
□投稿者/ ぼーちゃん (2回)-(2025/02/13(Thu) 11:57:57)
No103540 (魔界の仮面弁士 さん) に返信

> そのツールの元になった、Microsoft USBView sample コードが下記にあります。
> https://learn.microsoft.com/en-us/samples/microsoft/windows-driver-samples/usbview-sample-application/?WT.mc_id=DT-MVP-8907
> https://github.com/microsoft/windows-driver-samples/tree/main/usb/usbview
>
> 関連情報
> https://stackoverflow.com/questions/6416931/can-the-physical-usb-port-be-identified-programmatically-for-a-device-in-windows

早速の情報ありがとうございます!元のコードがあるのに気づきませんでした。
確認の上結果をご報告します。
[ 親 103539 / □ Tree ] 返信 編集キー/

▲[ 103541 ] / ▼[ 103561 ]
■103543 / 3階層)  Re[3]: USBポートのどの口にUSBメモリが挿入されたかを認識したい
□投稿者/ ぼーちゃん (3回)-(2025/02/14(Fri) 11:21:01)
No103541 (ぼーちゃん さん) に返信
> ■No103540 (魔界の仮面弁士 さん) に返信
>関連情報
>https://stackoverflow.com/questions/6416931/can-the-physical-usb-port-be-identified-programmatically-for-a-device-in-windows

頂いたURLに書かれている通り、元ツール(C/C++)の必要な機能を .NETから呼び出せるように dll化するなどで行けそうなことが分かりました。

また、まだ詳しく検証できていませんが、下記のC#クローンアプリが存在しており、
https://sourceforge.net/projects/usbviewerincsha/

このクローンのUSB API部分が単体でライブラリとしても公開されていることがわかりました ※LGPL v2.1
https://github.com/DerekGn/NativeUsbLib

元ツールから自作するか、検証の上ライブラリを使用するかは検討中ですが目途はついたので一旦クローズさせていただきます。
ありがとうございました。
解決済み
[ 親 103539 / □ Tree ] 返信 編集キー/

▲[ 103543 ] / ▼[ 103563 ]
■103561 / 4階層)  (削除)
□投稿者/ -(2025/02/19(Wed) 12:20:03)
この記事は(管理者)削除されました
[ 親 103539 / □ Tree ] 返信 編集キー/

▲[ 103561 ] / 返信無し
■103563 / 5階層)  Re[5]: (削除)
□投稿者/ とっちゃん (841回)-(2025/02/21(Fri) 13:02:17)
スパムを削除した関係で解決済みも消えてるので再度チェック

解決済み
[ 親 103539 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -