C#:USB设备枚举(五)生成TreeView数据源

215 篇文章 2 订阅
120 篇文章 3 订阅

作者:Splash

转自:http://blog.csdn.net/jhqin/article/details/6951730


[csharp] view plain copy
  1. /* ---------------------------------------------------------- 
  2. 文件名称:TreeViewUsbItem.cs 
  3.  
  4. 作者:秦建辉 
  5.  
  6. MSN:splashcn@msn.com 
  7. QQ:36748897 
  8.  
  9. 博客:http://blog.csdn.net/jhqin 
  10.  
  11. 开发环境: 
  12.     Visual Studio V2010 
  13.     .NET Framework 4 Client Profile 
  14.  
  15. 版本历史:     
  16.     V1.0    2011年10月26日 
  17.             为USB设备枚举信息生成TreeView数据源 
  18. ------------------------------------------------------------ */  
  19. using System;  
  20. using System.Collections.Generic;  
  21. using System.Windows.Media;  
  22. using System.Windows.Media.Imaging;  
  23. using Splash.IO.PORTS;  
  24.   
  25. namespace WPFUsbView  
  26. {  
  27.     /// <summary>  
  28.     /// TreeView节点对象  
  29.     /// </summary>  
  30.     internal class TreeViewUsbItem  
  31.     {  
  32.         /// <summary>  
  33.         /// 节点图标  
  34.         /// </summary>  
  35.         public ImageSource Icon { getset; }  
  36.           
  37.         /// <summary>  
  38.         /// 节点名称  
  39.         /// </summary>  
  40.         public String Name { getset; }  
  41.   
  42.         /// <summary>  
  43.         /// 节点数据  
  44.         /// </summary>  
  45.         public Object Data { getset; }  
  46.           
  47.         /// <summary>  
  48.         /// 子节点列表  
  49.         /// </summary>  
  50.         public List<TreeViewUsbItem> Children { getset; }          
  51.   
  52.         /// <summary>  
  53.         /// 计算机图标  
  54.         /// </summary>  
  55.         public static ImageSource ImageComputer  
  56.         {  
  57.             get  
  58.             {  
  59.                 return System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(  
  60.                     Properties.Resources.notebook.Handle,  
  61.                     System.Windows.Int32Rect.Empty,  
  62.                     BitmapSizeOptions.FromEmptyOptions()  
  63.                     );  
  64.             }  
  65.         }       
  66.   
  67.         /// <summary>  
  68.         /// 主控制器图标  
  69.         /// </summary>  
  70.         public static ImageSource ImageHostController  
  71.         {  
  72.             get  
  73.             {  
  74.                 return System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(  
  75.                     Properties.Resources.usb.Handle,  
  76.                     System.Windows.Int32Rect.Empty,  
  77.                     BitmapSizeOptions.FromEmptyOptions()  
  78.                     );  
  79.             }  
  80.         }  
  81.   
  82.         /// <summary>  
  83.         /// Hub图标  
  84.         /// </summary>  
  85.         public static ImageSource ImageHub  
  86.         {  
  87.             get  
  88.             {  
  89.                 return System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(  
  90.                     Properties.Resources.hub.Handle,  
  91.                     System.Windows.Int32Rect.Empty,  
  92.                     BitmapSizeOptions.FromEmptyOptions()  
  93.                     );  
  94.             }  
  95.         }  
  96.   
  97.         /// <summary>  
  98.         /// USB设备图标  
  99.         /// </summary>  
  100.         public static ImageSource ImageDevice  
  101.         {  
  102.             get  
  103.             {  
  104.                 return System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(  
  105.                     Properties.Resources.port.Handle,  
  106.                     System.Windows.Int32Rect.Empty,  
  107.                     BitmapSizeOptions.FromEmptyOptions()  
  108.                     );  
  109.             }  
  110.         }  
  111.   
  112.         /// <summary>  
  113.         /// 连接的外部Hub数目  
  114.         /// </summary>  
  115.         public static Int32 ConnectedHubs = 0;  
  116.   
  117.         /// <summary>  
  118.         /// 连接的USB设备数目  
  119.         /// </summary>  
  120.         public static Int32 ConnectedDevices = 0;  
  121.   
  122.         /// <summary>  
  123.         /// 静态根节点  
  124.         /// </summary>  
  125.         public static List<TreeViewUsbItem> AllUsbDevices  
  126.         {  
  127.             get  
  128.             {  
  129.                 // 初始化  
  130.                 ConnectedHubs = 0;      // 连接的外部Hub数目  
  131.                 ConnectedDevices = 0;   // 连接的USB设备数目  
  132.   
  133.                 // 创建根节点  
  134.                 TreeViewUsbItem Root = new TreeViewUsbItem();  
  135.                 Root.Icon = ImageComputer;  
  136.                 Root.Name = "Computer";  
  137.                 Root.Data = "Machine Name:" + System.Environment.MachineName;  
  138.                   
  139.                 // 子节点列表  
  140.                 // 深度遍历主控制器  
  141.                 HostControllerInfo[] HostControllersCollection = USB.AllHostControllers;  
  142.                 if (HostControllersCollection != null)  
  143.                 {  
  144.                     List<TreeViewUsbItem> HCNodeCollection = new List<TreeViewUsbItem>(HostControllersCollection.Length);  
  145.                     foreach (HostControllerInfo item in HostControllersCollection)  
  146.                     {   // 创建主控制器节点  
  147.                         TreeViewUsbItem HCNode = new TreeViewUsbItem();  
  148.   
  149.                         HCNode.Icon = ImageHostController;  
  150.                         HCNode.Name = item.Name;  
  151.                         HCNode.Data = item;  
  152.   
  153.                         // 创建根集线器节点  
  154.                         String RootHubPath = USB.GetUsbRootHubPath(item.PNPDeviceID);  
  155.                         HCNode.Children = AddHubNode(RootHubPath, "RootHub");  
  156.   
  157.                         HCNodeCollection.Add(HCNode);                         
  158.                     }  
  159.   
  160.                     Root.Children = HCNodeCollection;  
  161.                 }  
  162.   
  163.                 return new List<TreeViewUsbItem>(1) { Root };  
  164.             }  
  165.         }  
  166.   
  167.         /// <summary>  
  168.         /// Hub节点  
  169.         /// </summary>  
  170.         /// <param name="HubPath">Hub路径</param>  
  171.         /// <param name="HubNodeName">节点显示名称</param>  
  172.         /// <returns>Hub节点集合</returns>  
  173.         private static List<TreeViewUsbItem> AddHubNode(String HubPath, String HubNodeName)  
  174.         {  
  175.             UsbNodeInformation[] NodeInfoCollection = USB.GetUsbNodeInformation(HubPath);  
  176.             if (NodeInfoCollection != null)  
  177.             {  
  178.                 TreeViewUsbItem HubNode = new TreeViewUsbItem();  
  179.                 HubNode.Icon = ImageHub;  
  180.                 if (String.IsNullOrEmpty(NodeInfoCollection[0].Name))  
  181.                 {  
  182.                     HubNode.Name = HubNodeName;  
  183.                 }  
  184.                 else  
  185.                 {  
  186.                     HubNode.Name = NodeInfoCollection[0].Name;  
  187.                 }  
  188.                 HubNode.Data = NodeInfoCollection[0];  
  189.   
  190.                 if (NodeInfoCollection[0].NodeType == USB_HUB_NODE.UsbHub)  
  191.                 {  
  192.                     HubNode.Children = AddPortNode(HubPath, NodeInfoCollection[0].NumberOfPorts);  
  193.                 }  
  194.                 else  
  195.                 {  
  196.                     HubNode.Children = null;  
  197.                 }  
  198.   
  199.                 return new List<TreeViewUsbItem>(1) { HubNode };  
  200.             }  
  201.               
  202.             return null;  
  203.         }  
  204.   
  205.         /// <summary>  
  206.         /// Port节点  
  207.         /// </summary>  
  208.         /// <param name="HubPath">Hub路径</param>  
  209.         /// <param name="NumberOfPorts">端口数</param>  
  210.         /// <returns>Port节点集合</returns>  
  211.         private static List<TreeViewUsbItem> AddPortNode(String HubPath, Int32 NumberOfPorts)  
  212.         {  
  213.             // 深度遍历端口  
  214.             UsbNodeConnectionInformation[] NodeConnectionInfoCollection = USB.GetUsbNodeConnectionInformation(HubPath, NumberOfPorts);  
  215.             if (NodeConnectionInfoCollection != null)  
  216.             {  
  217.                 List<TreeViewUsbItem> PortNodeCollection = new List<TreeViewUsbItem>(NumberOfPorts);  
  218.                 foreach (UsbNodeConnectionInformation NodeConnectionInfo in NodeConnectionInfoCollection)  
  219.                 {   // 增加端口节点  
  220.                     TreeViewUsbItem PortNode = new TreeViewUsbItem();  
  221.   
  222.                     PortNode.Icon = ImageDevice;  
  223.                     PortNode.Name = "[Port" + NodeConnectionInfo.ConnectionIndex + "]" + NodeConnectionInfo.ConnectionStatus;  
  224.                     PortNode.Data = NodeConnectionInfo;  
  225.                     PortNode.Children = null;  
  226.                     if (NodeConnectionInfo.ConnectionStatus == USB_CONNECTION_STATUS.DeviceConnected)  
  227.                     {  
  228.                         // 设备连接  
  229.                         ConnectedDevices++; // 连接的USB设备数目  
  230.                         if (!String.IsNullOrEmpty(NodeConnectionInfo.DeviceDescriptor.Product))  
  231.                         {   // 产品名称  
  232.                             PortNode.Name = String.Concat(PortNode.Name, ": ", NodeConnectionInfo.DeviceDescriptor.Product);  
  233.                         }  
  234.   
  235.                         if (NodeConnectionInfo.DeviceIsHub)  
  236.                         {  
  237.                             // 获取外部Hub设备路径  
  238.                             String ExternalHubPath = USB.GetExternalHubPath(NodeConnectionInfo.DevicePath, NodeConnectionInfo.ConnectionIndex);  
  239.                             UsbNodeInformation[] NodeInfoCollection = USB.GetUsbNodeInformation(HubPath);  
  240.                             if (NodeInfoCollection != null)  
  241.                             {  
  242.                                 PortNode.Icon = ImageHub;  
  243.                                 PortNode.Data = new ExternalHubInfo { NodeInfo = NodeInfoCollection[0], NodeConnectionInfo = NodeConnectionInfo };  
  244.                                 if (NodeInfoCollection[0].NodeType == USB_HUB_NODE.UsbHub)  
  245.                                 {  
  246.                                     PortNode.Children = AddPortNode(ExternalHubPath, NodeInfoCollection[0].NumberOfPorts);  
  247.                                 }  
  248.   
  249.                                 if (String.IsNullOrEmpty(NodeConnectionInfo.DeviceDescriptor.Product))  
  250.                                 {  
  251.                                     if (!String.IsNullOrEmpty(NodeInfoCollection[0].Name))  
  252.                                     {   // 产品名称  
  253.                                         PortNode.Name = String.Concat(PortNode.Name, ": ", NodeInfoCollection[0].Name);  
  254.                                     }  
  255.                                 }  
  256.                             }  
  257.   
  258.                             ConnectedHubs++;    // 连接的外部Hub数目  
  259.                         }                
  260.                     }  
  261.                       
  262.                     PortNodeCollection.Add(PortNode);                      
  263.                 }  
  264.   
  265.                 return PortNodeCollection;  
  266.             }  
  267.   
  268.             return null;  
  269.         }      
  270.     }  
  271. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值