나는 마침내 자신 며칠 전에 정리되었다. 두 부분으로 하나는 레지스트리를 확인하고 다른 하나는 장치의 vid/pid를 확인합니다.
com0com과 같은 널 모뎀 에뮬레이터를 캡처하지 않도록하기 위해 사용하는 레지스트리 방법입니다.
/// <summary>
/// Removes any comm ports that are not explicitly defined as allowed in ALLOWED_TYPES
/// </summary>
/// <param name="allPorts">reference to List that will be checked</param>
/// <returns></returns>
private static void nullModemCheck(ref List<string> allPorts)
{
// Open registry to get the COM Ports available with the system
RegistryKey regKey = Registry.LocalMachine;
// Defined as: private const string REG_COM_STRING ="HARDWARE\DEVICEMAP\SERIALCOMM";
regKey = regKey.OpenSubKey(REG_COM_STRING);
Dictionary<string, string> tempDict = new Dictionary<string, string>();
foreach (string p in allPorts)
tempDict.Add(p, p);
// This holds any matches we may find
string match = "";
foreach (string subKey in regKey.GetValueNames())
{
// Name must contain either VCP or Seial to be valid. Process any entries NOT matching
// Compare to subKey (name of RegKey entry)
if (!(subKey.Contains("Serial") || subKey.Contains("VCP")))
{
// Okay, this might be an illegal port.
// Peek in the dictionary, do we have this key? Compare to regKey.GetValue(subKey)
if(tempDict.TryGetValue(regKey.GetValue(subKey).ToString(), out match))
{
// Kill it!
allPorts.Remove(match);
// Reset our output string
match = "";
}
}
}
regKey.Close();
}
VID를은/PID 부는 단지 COM 포트 USB 포트 아니다 techinpro
/// <summary>
/// Compile an array of COM port names associated with given VID and PID
/// </summary>
/// <param name="VID">string representing the vendor id of the USB/Serial convertor</param>
/// <param name="PID">string representing the product id of the USB/Serial convertor</param>
/// <returns></returns>
private static List<string> getPortByVPid(String VID, String PID)
{
String pattern = String.Format("^VID_{0}.PID_{1}", VID, PID);
Regex _rx = new Regex(pattern, RegexOptions.IgnoreCase);
List<string> comports = new List<string>();
RegistryKey rk1 = Registry.LocalMachine;
RegistryKey rk2 = rk1.OpenSubKey("SYSTEM\\CurrentControlSet\\Enum");
foreach (String s3 in rk2.GetSubKeyNames())
{
RegistryKey rk3 = rk2.OpenSubKey(s3);
foreach (String s in rk3.GetSubKeyNames())
{
if (_rx.Match(s).Success)
{
RegistryKey rk4 = rk3.OpenSubKey(s);
foreach (String s2 in rk4.GetSubKeyNames())
{
RegistryKey rk5 = rk4.OpenSubKey(s2);
RegistryKey rk6 = rk5.OpenSubKey("Device Parameters");
comports.Add((string)rk6.GetValue("PortName"));
}
}
}
}
return comports;
}
직렬 포트로부터 수집 하였다. –
가능한 [장치가 직렬 또는 블루투스에 연결되어 있는지를 알아야 함] (http://stackoverflow.com/questions/3659939/need-to-know-whether-a-device-is-wired-serial-or-) 블루투스) –
몇 가지 추가 정보를 추가하려면 다음과 같이하십시오.이 게시물을 작성할 때 공급 업체 ID 또는 장치 ID를 수신하려면 포트/연결을 열어 두어야합니다. 나는이 코드를 Windows 용으로 작성하고 있으므로 이렇게하면 Windows 등록 정보를 수집해야합니다. 나는 올바른 장치를 찾아서 실행할 수있는 코드를 acompilsh하려고합니다. – Christian