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

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

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

C#で、現在認識しているUSBコントローラーの列挙

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

■82939 / inTopicNo.1)  C#で、現在認識しているUSBコントローラーの列挙
  
□投稿者/ 政吉 (16回)-(2017/02/20(Mon) 21:27:29)

分類:[.NET 全般] 

こんばんわ
政吉と申します。

Visual Studio Community 2015 C# WPFで、Windows10で動作可能なアプリケーションを作成しています。
Windows10のPC上で現在認識しているシリアルポートを取得する方法を、下記のプログラムで実現しています。

            int iWrk = 0;
            string sWrk;
            string ComPort = "COM3";

            // ポート一覧に"USB シリアル デバイス"があるか検索
            ManagementClass mcW32SerPort = new ManagementClass("Win32_SerialPort");
            foreach (ManagementObject port in mcW32SerPort.GetInstances())
            {
                sWrk = (port.GetPropertyValue("Caption")).ToString();
                if (sWrk.IndexOf("USB シリアル デバイス") != -1)
                {
                    iWrk = 1;
                    ComPort = port.GetPropertyValue("DeviceID").ToString();
                }
            }

            if (iWrk == 0)  // ポートが無かった場合はエラー
            {
                // エラー処理書く
            }
            else
            {
                serialPort = new SerialPort(ComPort, 115200, Parity.None, 8, StopBits.One);
                serialPort.Open();  // シリアルポートオープン
            }


今回、シリアルポートではなく、現在PCに接続されている(PCが認識している)USBコントローラの名前を
上記のシリアルポートのように取得して、特定の名称のUSBコントローラが接続されているかどうかを
調べたいです。
(デバイスマネージャの「ユニバーサルシリアルバスコントローラー」のツリー下層のコントローラ名称
を取得したい)

            // USBコントローラの一覧に"STM Device in DFU Mode"があるか検索
            ManagementClass mcW32USBDevice = new ManagementClass("Win32_USBControllerDevice");
            foreach (ManagementObject USBDevice in mcW32USBDevice.GetInstances())
            {
                sWrk = (USBDevice.GetPropertyValue("Caption")).ToString();
                if (sWrk.IndexOf("STM Device in DFU Mode") != -1)
                {
                    iWrk = 1;
                }
            }
            if (iWrk == 1)  // DFU Modeだったらエラー
            {
                // エラー処理書く
            }

と書いてみたのですが、
                sWrk = (USBDevice.GetPropertyValue("Caption")).ToString();
の行でエラーとなってしまいます。

どのようにコーディングするのが良いでしょうか?
よろしくお願いします。

引用返信 編集キー/
■82940 / inTopicNo.2)  Re[1]: C#で、現在認識しているUSBコントローラーの列挙
□投稿者/ Hongliang (501回)-(2017/02/20(Mon) 21:37:52)
Win32_USBControllerDeviceクラスは、USBコントローラとデバイス間の関係を表現するためのものらしいですよ。
https://msdn.microsoft.com/en-us/library/aa394505.aspx
お望みのクラスはWin32_USBControllerではないでしょうか(詳しくは確認していませんが)。
https://msdn.microsoft.com/en-us/library/aa394504.aspx
引用返信 編集キー/
■82942 / inTopicNo.3)  Re[1]: C#で、現在認識しているUSBコントローラーの列挙
□投稿者/ 魔界の仮面弁士 (1140回)-(2017/02/20(Mon) 21:57:45)
2017/02/20(Mon) 22:06:23 編集(投稿者)

No82939 (政吉 さん) に返信
> sWrk = (USBDevice.GetPropertyValue("Caption")).ToString();
> の行でエラーとなってしまいます。

Win32_USBControllerDevice クラスに Caption プロパティはありませんよ。(^^;
Win32_SerialPort クラスにはありますけど。
https://msdn.microsoft.com/ja-jp/library/aa394505.aspx
https://msdn.microsoft.com/en-us/library/aa394413.aspx


シリアルポート付きの環境が無いので確認できないのですが、
<DEL>Win32_SerialPort.Availability プロパティあたりで確認できないでしょうか。</DEL>


失礼。シリアルポートそのものを得たいわけでは無いのですね。

シリアルポートの親となるコントローラーを得たいのなら、
Win32_USBControllerDevice の Antecedent で
CIM_USBController を得られます。

単純にすべてを列挙するだけなら、CIM_USBController を
直接 GetInstances() しても良いですが。


※質問内容を勘違いしていたので、下記も無視してください。m(_ _)m


> どのようにコーディングするのが良いでしょうか?
Win32_USBControllerDevice から辿るとなると、Dependent プロパティから
CIM_LogicalDevice を調べる感じですかね。

(Win32_SerialPort は CIM_LogicalDevice を継承しています)


手ごろな C# のコードが見つからなかったのですが、関係しそうなところを幾つか

IronPython で接続しているUSBデバイスの列挙
http://d.hatena.ne.jp/Wacky/20070422/1177250208

C# で USB接続のスキャナの電源確認
http://bit.ly/2m0oNaI

参考になれば。
引用返信 編集キー/
■82944 / inTopicNo.4)  Re[2]: C#で、現在認識しているUSBコントローラーの列挙
□投稿者/ 政吉 (17回)-(2017/02/20(Mon) 22:17:45)
Hongliang さん

アドバイスありがとうございます。

            // USBコントローラの一覧に"STM Device in DFU Mode"があるか検索
            ManagementClass mcW32USBDevice = new ManagementClass("Win32_USBController");
            foreach (ManagementObject USBDevice in mcW32USBDevice.GetInstances())
            {
                sWrk = (USBDevice.GetPropertyValue("Caption")).ToString();
                if (sWrk.IndexOf("STM Device in DFU Mode") != -1)
                {
                    iWrk = 1;
                }
            }
            if (iWrk == 1)  // DFU Modeだったらエラー
            {
                // エラー処理書く
            }


に修正してやってみました。
テストしたところ、デバイスマネージャの「ユニバーサルシリアルバスコントローラー」の下層の項目の、
最初の2つは取れたのですが、デバイスマネージャ上は11個の項目がぶら下がっているのですが、
            foreach (ManagementObject USBDevice in mcW32USBDevice.GetInstances())
のところで、3つ目の項目の処理がされずに、foreach () 文を抜けてしまいました。


デバイスマネージャのUSBコントローラーのツリー表示上では
「ユニバーサルシリアルバスコントローラー」
  − Intel(R) USB3.0 eXtensible Host Controller - 1.0(Microsoft)
  − Intel(R) USB3.1 eXtensible Host Controller - 1.10(Microsoft)
  − SafeNet USB SuperPro/UltraPro
  − STM 32 Device in DFU Mode
  − ...
  − ...
  − ...

となっているのですが、上記のプログラムでは、foreach () ループ内を2回繰り返し、
sWrk に、「Intel(R) USB3.1 eXtensible Host Controller - 1.10(Microsoft)」と、
「Intel(R) USB3.1 eXtensible Host Controller - 1.10(Microsoft)」は代入されたのですが
3回目は回らずに、foreach () ループを抜けてしまいました。
foreach () 文のところ、記述間違っているでしょうか?
アドバイスいただけるとありがたいです。

引用返信 編集キー/
■82945 / inTopicNo.5)  Re[3]: C#で、現在認識しているUSBコントローラーの列挙
□投稿者/ 魔界の仮面弁士 (1142回)-(2017/02/20(Mon) 22:35:04)
2017/02/20(Mon) 22:39:42 編集(投稿者)

No82944 (政吉 さん) に返信
> 最初の2つは取れたのですが、デバイスマネージャ上は11個の項目がぶら下がっているのですが、
> foreach (ManagementObject USBDevice in mcW32USBDevice.GetInstances())
> のところで、3つ目の項目の処理がされずに、foreach () 文を抜けてしまいました。


デバイスマネージャーの [表示]-[デバイス(種類別)] が 11 項目で、
Get-WmiObject Win32_USBControllerDevice |%{[wmi]($_.Dependent)} | select Name

デバイスマネージャーの [表示]-[デバイス(接続別)] が 2 項目だったりしませんか?
Get-WmiObject Win32_USBController | select Name


※C# で書くのが面倒だったので、上記は PowerShell で書いています。
引用返信 編集キー/
■82946 / inTopicNo.6)  Re[4]: C#で、現在認識しているUSBコントローラーの列挙
□投稿者/ 政吉 (18回)-(2017/02/20(Mon) 22:58:46)
魔界の仮面弁士さん

ありがとうございます。
ご指摘の通り、
> デバイスマネージャーの [表示]-[デバイス(種類別)] が 11 項目
でした。
ですが、 [表示]-[デバイス(接続別)] にしたら、ツリー表示が完全に変化してしまい、一覧の中に、
「Intel(R) USB3.0 eXtensible Host Controller - 1.0(Microsoft)」
はあるのですが、その下層に汎用USBハブがあり、さらにその下層に、今回検出したい
「STM Device in DFU Mode」がぶら下がっていました。

今まで「種類別」の方しか見たことがありませんでした。
「接続別」の表示は、USBハブなどを通して接続されている構成がそのままツリー表示されるような
イメージでしょうか?

接続の順序・構成はどうでもよいので、つながっているUSBコントローラの中に、
「STM Device in DFU Mode」があるかどうかが知りたいです。
魔界の仮面弁士さんの最後に書かれている

> Get-WmiObject Win32_USBController | select Name
> Get-WmiObject Win32_USBControllerDevice |%{[wmi]($_.Dependent)} | select Name

これがその方法でしょうか?
すみません、このあたり知識がなく、詳しく教えていただけないでしょうか?

引用返信 編集キー/
■82947 / inTopicNo.7)  Re[5]: C#で、現在認識しているUSBコントローラーの列挙
□投稿者/ 魔界の仮面弁士 (1143回)-(2017/02/20(Mon) 23:02:59)
2017/02/20(Mon) 23:23:23 編集(投稿者)

No82946 (政吉 さん) に返信
> 接続の順序・構成はどうでもよいので、つながっているUSBコントローラの中に、
> 「STM Device in DFU Mode」があるかどうかが知りたいです。


手元の環境だと、[表示]-[デバイス(種類別)] の
「ユニバーサル シリアル バス コントローラー」の下には、
Win32_USBController だけでなく、Win32_USBHub もぶら下がっていました。

詳しく調べていないので、環境によっては、他にも列挙されるものがあるのかも知れませんが。

foreach (var cls in new[] { "Win32_USBHub", "Win32_USBController" })
{
 using (var mc = new ManagementClass(cls))
 using (var col = mc.GetInstances())
 {
  foreach (var item in col)
  {
   Console.WriteLine(item["Caption"] ); // 表示名
   Console.WriteLine(item["DeviceID"]); // デバイスインスタンスパス
   Console.WriteLine();
   item.Dispose();
  }
 }
}


もし、Win32_USBHub で列挙可能なアイテムだとしたら、下記で探せるかも。

string name = "STM Device in DFU Mode";
var wql = $"SELECT DeviceID FROM Win32_USBHub WHERE Caption = {name}";

bool found = false;
using (var mos = new ManagementObjectSearcher(wql))
using (var col = mos.Get())
{
 found = col.Count > 0;
}
引用返信 編集キー/
■83035 / inTopicNo.8)  Re[6]: C#で、現在認識しているUSBコントローラーの列挙
□投稿者/ 政吉 (19回)-(2017/02/28(Tue) 18:32:38)
魔界の仮面弁士さん

返信&お礼おそくなりすみません。

教えていただいた、

> foreach (var cls in new[] { "Win32_USBHub", "Win32_USBController" })
> {
>  using (var mc = new ManagementClass(cls))
>  using (var col = mc.GetInstances())
>  {
>   foreach (var item in col)
>   {
>    Console.WriteLine(item["Caption"] ); // 表示名
>    Console.WriteLine(item["DeviceID"]); // デバイスインスタンスパス
>    Console.WriteLine();
>    item.Dispose();
>   }
>  }
> }

こちらの方法で、無事目的のデバイスの名称を取得することができました。
ありがとうございました。


解決済み
引用返信 編集キー/

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


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

このトピックに書きこむ