下面的代码在Windows 7和.NET 3.5中运行良好。 在Windows 8.1和.NET 4.5.1中,我得到一个空结果,但使用WMI Code Creator我可以得到结果。
我在网上找不到任何相关内容。
我想获得任何COM端口的友好名称,例如“通讯端口(COM1)”。
只使用System.IO.Ports.SerialPort.GetPortNames()
不会。
我真的希望有人知道如何做到这一点。谢谢!
using System;
using System.Collections.Generic;
using System.Management;
namespace OakHub
{
public class SerialMgmt
{
static public List<String> GetCOMDevices()
{
List<String> list = new List<String>();
ManagementScope scope = new ManagementScope(@"\\" + Environment.MachineName + @"\root\CIMV2");
SelectQuery sq = new SelectQuery("SELECT Caption FROM Win32_PnPEntity");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, sq);
ManagementObjectCollection moc = searcher.Get();
foreach (ManagementObject mo in moc)
{
String name = mo.ToString();
if (name.ToString().Contains("(COM"))
{
list.Add(name);
}
}
return list;
}
}
}
答案 0 :(得分:2)
首先,我不知道为什么这段代码甚至适合你(使用.Net 3.5)。
Caption
。 (如果需要,使用*选择全部)我想你想要Win32_PnPEntity-Devices的名字, cant 用这行代码获取它
String name = mo.ToString();
因为Name是一个属性。首先必须使用WMI字符串加载属性:
SELECT Name,Caption FROM Win32_PnPEntity
//获取姓名和标题属性
或
SELECT * FROM Win32_PnPEntity
//加载该WMI-Obj的所有Propertys
而且你必须检查值是否为null - >返回值
代码:
public List<String> GetLocalCOMDevices()
{
List<String> list = new List<String>();
ManagementScope scope = new ManagementScope(@"\\" + Environment.MachineName + @"\root\CIMV2");
SelectQuery sq = new SelectQuery("SELECT Name,Caption FROM Win32_PnPEntity");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, sq);
ManagementObjectCollection moc = searcher.Get();
foreach (ManagementObject mo in moc)
{
object propName = mo.Properties["Name"].Value;
if (propName == null) { continue; }
list.Add(propName.ToString());
}
return list;
}