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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.82939 の関連記事表示

<< 0 >>
■82939  C#で、現在認識しているUSBコントローラーの列挙
□投稿者/ 政吉 -(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();
    の行でエラーとなってしまいます。

    どのようにコーディングするのが良いでしょうか?
    よろしくお願いします。
親記事 /過去ログ141より / 関連記事表示
削除チェック/

■82942  Re[1]: C#で、現在認識しているUSBコントローラーの列挙
□投稿者/ 魔界の仮面弁士 -(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

    参考になれば。
記事No.82939 のレス /過去ログ141より / 関連記事表示
削除チェック/

■82940  Re[1]: C#で、現在認識しているUSBコントローラーの列挙
□投稿者/ Hongliang -(2017/02/20(Mon) 21:37:52)
記事No.82939 のレス /過去ログ141より / 関連記事表示
削除チェック/

■82944  Re[2]: C#で、現在認識しているUSBコントローラーの列挙
□投稿者/ 政吉 -(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 () 文のところ、記述間違っているでしょうか?
    アドバイスいただけるとありがたいです。
    
記事No.82939 のレス /過去ログ141より / 関連記事表示
削除チェック/

■82945  Re[3]: C#で、現在認識しているUSBコントローラーの列挙
□投稿者/ 魔界の仮面弁士 -(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 で書いています。
記事No.82939 のレス /過去ログ141より / 関連記事表示
削除チェック/

■82946  Re[4]: C#で、現在認識しているUSBコントローラーの列挙
□投稿者/ 政吉 -(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

    これがその方法でしょうか?
    すみません、このあたり知識がなく、詳しく教えていただけないでしょうか?
記事No.82939 のレス /過去ログ141より / 関連記事表示
削除チェック/

■82947  Re[5]: C#で、現在認識しているUSBコントローラーの列挙
□投稿者/ 魔界の仮面弁士 -(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;
    }
記事No.82939 のレス /過去ログ141より / 関連記事表示
削除チェック/

■83035  Re[6]: C#で、現在認識しているUSBコントローラーの列挙
□投稿者/ 政吉 -(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();
    >   }
    >  }
    > }

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

記事No.82939 のレス / END /過去ログ141より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -