与此问题相关,但是…是否可以通过API触发新的硬件设备扫描? 我有一个串口蓝牙设备,我通过与32feet.net .NET蓝牙的 API调用自动配对,这很好地工作。 虽然我可以查询设备扫描中的串行服务,但COM端口不会显示在“蓝牙设备”对话框的“COM端口”选项卡中。
与在Windows设备管理器中以编程方式卸载设备有关
我从那里回答:
要强制执行“扫描硬件更改”结帐“ 如何强制重新枚举设备树从应用程序 ”该示例显示如何强制整个树重新枚举。
不知道这是否会帮助你的整体问题,但这应该回答你的第一句话的问题。
我原来在几年前使用Nullsoft的NSIS安装程序做了这样的事情。
如果你只是想触发一个香草硬件扫描,你可以使用下面的代码(在这个问题中用.net标记在C#中提供):
这是P / Invoke函数的包装类
public static class Win32Api { public const int CM_LOCATE_DEVNODE_NORMAL = 0x00000000; public const int CM_REENUMERATE_NORMAL = 0x00000000; public const int CR_SUCCESS = 0x00000000; [DllImport("CfgMgr32.dll", SetLastError=true)] public static extern int CM_Locate_DevNodeA(ref int pdnDevInst, string pDeviceID, int ulFlags); [DllImport("CfgMgr32.dll", SetLastError=true)] public static extern int CM_Reenumerate_DevNode(int dnDevInst, int ulFlags); }
这是如何使用它们的示例
int pdnDevInst = 0; if (Win32Api.CM_Locate_DevNodeA(ref pdnDevInst, null, Win32Api.CM_LOCATE_DEVNODE_NORMAL) != Win32Api.CR_SUCCESS) throw new Exception("something..."); if (Win32Api.CM_Reenumerate_DevNode(pdnDevInst, Win32Api.CM_REENUMERATE_NORMAL) != Win32Api.CR_SUCCESS) throw new Exception("something else...");
我刚刚从MSDN C ++文档中快速翻译过来,并在秒杀中对其进行了测试,所以我知道它可行,但这不是生产质量。 另外,如果您关心具体的返回码,则可以在cfgmgr32.h中查找它们。
我的答案在下面有帮助吗? 我怎样才能找出在C#中的蓝牙设备的COM端口号?
简而言之,使用System.IO.Ports.SerialPort.GetPortNames()
或WMI列出串行端口,例如PowerShell命令:
C:\> Get-WmiObject -query "select DeviceID,PNPDeviceID from Win32_SerialPort"
这也可以在代码中完成。
刚刚找到这个SO帖子 ,也可以解决我的问题或其他人发现这个问题。