【发布时间】:2010-02-02 02:25:53
【问题描述】:
与this question 相关,但是... 是否可以通过 API 触发新的硬件设备扫描?我有一个串口蓝牙设备,我通过 API 调用与32feet.net .NET Bluetooth 自动配对,效果很好。虽然我可以在扫描设备时查询串行服务,但 COM 端口不会显示在蓝牙设备对话框的 COM 端口选项卡中。
【问题讨论】:
标签: .net windows winapi bluetooth
与this question 相关,但是... 是否可以通过 API 触发新的硬件设备扫描?我有一个串口蓝牙设备,我通过 API 调用与32feet.net .NET Bluetooth 自动配对,效果很好。虽然我可以在扫描设备时查询串行服务,但 COM 端口不会显示在蓝牙设备对话框的 COM 端口选项卡中。
【问题讨论】:
标签: .net windows winapi bluetooth
不确定这是否会对您的整体问题有所帮助,但这应该可以回答您第一句话中的问题。
几年前我最初使用 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 中查找它们。
【讨论】:
与Programmatically uninstall a device in windows device manager相关
我的回答:
强制'扫描硬件 更改'结帐“How To Force Reenumeration of a Device Tree From an Application”那里的样本 显示如何强制整个树 重新列举。
【讨论】:
我的回答对以下有帮助吗? How can I find out a COM port number of a bluetooth device in c#?
简单地使用System.IO.Ports.SerialPort.GetPortNames()或WMI来列出串口,例如PowerShell 命令:
C:\> Get-WmiObject -query "select DeviceID,PNPDeviceID from Win32_SerialPort"
这也可以在代码中完成。
【讨论】:
刚刚找到this SO post,它也可以解决我的问题或其他发现此问题的人。
【讨论】: