【问题标题】:Is there an API call to start a scan for hardware devices是否有 API 调用开始扫描硬件设备
【发布时间】:2010-02-02 02:25:53
【问题描述】:

this question 相关,但是... 是否可以通过 API 触发新的硬件设备扫描?我有一个串口蓝牙设备,我通过 API 调用与32feet.net .NET Bluetooth 自动配对,效果很好。虽然我可以在扫描设备时查询串行服务,但 COM 端口不会显示在蓝牙设备对话框的 COM 端口选项卡中。

【问题讨论】:

    标签: .net windows winapi bluetooth


    【解决方案1】:

    不确定这是否会对您的整体问题有所帮助,但这应该可以回答您第一句话中的问题。

    几年前我最初使用 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 中查找它们。

    【讨论】:

    • 没有看以前的答案,但以防万一你认为我在这里复制了我在 NSIS 中所做的原始版本:forums.winamp.com/showthread.php?t=192348
    • 另外,我的是 C#,MS 示例是经典 VB。
    • 像魅力一样工作。注意:您必须以管理权限运行 WINAPI 调用!在 Windows 8 x64 上测试
    【解决方案2】:

    Programmatically uninstall a device in windows device manager相关

    我的回答:

    强制'扫描硬件 更改'结帐“How To Force Reenumeration of a Device Tree From an Application”那里的样本 显示如何强制整个树 重新列举。

    【讨论】:

      【解决方案3】:

      我的回答对以下有帮助吗? 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" 
      

      这也可以在代码中完成。

      【讨论】:

        【解决方案4】:

        刚刚找到this SO post,它也可以解决我的问题或其他发现此问题的人。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-05-06
          • 1970-01-01
          • 2023-04-05
          • 1970-01-01
          • 1970-01-01
          • 2019-02-01
          • 2019-12-12
          • 2015-10-20
          相关资源
          最近更新 更多