2015-04-15 5 views
3

Я пишу код на C#, чтобы получить COM-порт, на котором отображается устройство Bluetooth с определенным именем. Я попробовал несколько решений, похожих на те, что перечислены here, но ни с кем из них у меня есть доступ к имени, как в окне настроек Bluethooth, как на картинке ниже:Получение COM-порта устройства Bluetooth по имени устройства в C#

picture

Если это на этом окне I» Конечно, есть способ найти его. Любая помощь?

Большое спасибо

+0

вы когда-нибудь получить это право? –

ответ

1

Попробуйте следующий фрагмент кода. Я использую его для поиска последовательных устройств по имени в приложении, которое я использую каждый день.

public static bool DoesSerialDeviceExist(string name) 
    { 
     using (var search = new ManagementObjectSearcher 
      ("SELECT * FROM WIN32_SerialPort")) 
     { 
      string[] portnames = SerialPort.GetPortNames(); 
      var ports = search.Get().Cast<ManagementBaseObject>().ToList(); 

      var tList = (from n in portnames 
         join p in ports on n equals p["DeviceID"].ToString() 
         select n + " - " + p["Caption"]).ToList(); 

      string serial = tList.FirstOrDefault(o => o.Contains(name)); 

      bool isAvailable = false; 
      if (serial != null) 
      { 
       isAvailable = true; 
      } 

      return isAvailable; 
     } 
    } 
+1

Спасибо за фрагмент, но он не возвращает имя, которое я хочу. Я попытался выполнить поиск в коллекции портов [x] .Properties, но я не могу найти то же имя, которое я могу увидеть в поле «name» («nome») на скриншоте. – Eux

1
private void FillInComportComboBox() 
    { 
     Hashtable PortNames = new Hashtable(); 
     string[] ports = System.IO.Ports.SerialPort.GetPortNames(); 

     //string st = ComPortList.Text; 

     ComPortList.Items.Clear(); 

     if (ports.Length == 0) 
     { 
      ComPortList.Items.Add("ERROR: No COM ports exist"); 
     } 
     else 
     { 
      PortNames = BuildPortNameHash(ports); 
      //foreach (string s in ports) 
      foreach(String s in PortNames.Keys) 
      { 
       //ComPortList.Items.Add(s + ": " + (string)PortNames[s]); 
       ComPortList.Items.Add(PortNames[s] + ": " + s); 
      } 
     } 
    } 




    // Begins recursive registry enumeration 
    // <param name="oPortsToMap">array of port names (i.e. COM1, COM2, etc)</param> 
    // <returns>a hashtable mapping Friendly names to non-friendly port values</returns> 
    Hashtable BuildPortNameHash(string[] oPortsToMap) 
    { 
     Hashtable oReturnTable = new Hashtable(); 
     MineRegistryForPortName("SYSTEM\\CurrentControlSet\\Enum", oReturnTable, oPortsToMap); 
     return oReturnTable; 
    } 
    // Recursively enumerates registry subkeys starting with strStartKey looking for 
    // "Device Parameters" subkey. If key is present, friendly port name is extracted. 
    // <param name="strStartKey">the start key from which to begin the enumeration</param> 
    // <param name="oTargetMap">hashtable that will get populated with 
    // friendly-to-nonfriendly port names</param> 
    // <param name="oPortNamesToMatch">array of port names (i.e. COM1, COM2, etc)</param> 
    void MineRegistryForPortName(string strStartKey, Hashtable oTargetMap, string[] oPortNamesToMatch) 
    { 
     if (oTargetMap.Count >= oPortNamesToMatch.Length) 
      return; 
     RegistryKey oCurrentKey = Registry.LocalMachine; 

     try 
     { 
      oCurrentKey = oCurrentKey.OpenSubKey(strStartKey); 

      string[] oSubKeyNames = oCurrentKey.GetSubKeyNames(); 
      if (((IList<string>)oSubKeyNames).Contains("Device Parameters") && strStartKey != "SYSTEM\\CurrentControlSet\\Enum") 
      { 
       object oPortNameValue = Registry.GetValue("HKEY_LOCAL_MACHINE\\" + strStartKey + "\\Device Parameters", "PortName", null); 

       if (oPortNameValue == null || ((IList<string>)oPortNamesToMatch).Contains(oPortNameValue.ToString()) == false) 
        return; 
       object oFriendlyName = Registry.GetValue("HKEY_LOCAL_MACHINE\\" + strStartKey, "FriendlyName", null); 

       string strFriendlyName = "N/A"; 

       if (oFriendlyName != null) 
        strFriendlyName = oFriendlyName.ToString(); 
       if (strFriendlyName.Contains(oPortNameValue.ToString()) == false) 
        strFriendlyName = string.Format("{0} ({1})", strFriendlyName, oPortNameValue); 
       oTargetMap[strFriendlyName] = oPortNameValue; 
       //oTargetMap[oPortNameValue] = strFriendlyName; 
      } 
      else 
      { 
       foreach (string strSubKey in oSubKeyNames) 
        MineRegistryForPortName(strStartKey + "\\" + strSubKey, oTargetMap, oPortNamesToMatch); 
      } 
     } 
     catch 
     { 

     } 
    } 
Смежные вопросы