同事实现的:
C#
public string getDevice()
{
string del = "";
//ManagementObjectSearcher mosList = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity"); //所有设备
ManagementObjectSearcher mosList = new ManagementObjectSearcher("SELECT * FROM Win32_POTSModem");
foreach (var mos in mosList.Get())
{
del = mos["Name"].ToString();//名字
Log(del);
//del = mos["DeviceID"].ToString();//VID PID
//del = mos["AttachedTo"].ToString();//com
}
mosList.Dispose();
return del;
}
python
MFC暂时没找到。用注册表里串口也能实现。
C++通过注册表实现串口自动:
#include <iostream>
#include <windows.h>
//***********************
// 注册表 枚举所有的串口,以及名称
//return 特定的串口号 或-1失败
//***********************
int getSpecialComNumByRegister()
{
HKEY hkey;
int result;
int i = 0;
result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Hardware\\DeviceMap\\SerialComm", NULL, KEY_READ, &hkey);
if (ERROR_SUCCESS == result) //打开串口注册表
{
do
{
TCHAR portName[0x100] = { 0 };//portName是注册表名称(不是设备管理器里的前缀),commName就是值 串口名字COMN
TCHAR commName[0x100] = { 0 };
DWORD dwSize = sizeof(portName) / sizeof(TCHAR);
DWORD dwLong = dwSize;
result = RegEnumValue(hkey, i, portName, &dwLong, NULL, NULL, (LPBYTE)commName, &dwSize);
if (ERROR_NO_MORE_ITEMS == result) { break; } // 枚举串口
printf("%d %s %s\n", i, portName, commName); //显示名称及值
if ((strcmp(portName,"\\Device\\sprd_usbcomm_serial2")==0) || (strncmp(portName, "\\Device\\QCUSB_COM",17) == 0 && strncmp(portName+strlen(portName)-2,"_2",2)==0) ) //特定串口
{
RegCloseKey(hkey); //关闭注册表
return atoi(commName + 3);//去掉COM只取号 正常返回
}
i++;
} while (TRUE);
RegCloseKey(hkey); //关闭注册表
}
return -1;//没找到特定串口
}