4

我正在编写一些使用 Windows蓝牙 API自动连接蓝牙设备的软件。当它连接时,Windows 会自动开始安装蓝牙 HID 设备驱动程序,如预期的那样:

安装蓝牙 HID 驱动程序

这大约需要 10-15 秒,之后 Windows 会显示熟悉的“准备使用”消息:

硬件已安装并可以使用

问题是BluetoothSetServiceState()驱动程序安装开始后立即返回,而不是在设备实际准备好使用时返回。这会给我的代码带来一些问题,因为它在“连接”后立即调用一个单独的库进行设备通信。前几个调用失败是因为驱动程序尚未完成安装,并且进行这些连接尝试似乎会干扰驱动程序安装,因为如果我在驱动程序安装完成之前尝试使用通信库 Windows 想要在设备可以之前重新启动使用。

我正在寻找的是一种在驱动程序安装实际完成时挂钩“准备使用”事件的方法,因此我不会过早地调用我的通信库。是否有一些 Windows API 调用可用于注册函数回调或直接轮询驱动程序安装的状态?

我正在用普通的 C/C++ 编写这个,而不是 .NET。谢谢你的帮助!

4

3 回答 3

4

您可能想查看 此示例代码RegisterDeviceNotification函数。我不确定 100%,但如果您为设备类指定正确的 guid,它似乎可以工作。

于 2009-02-27T21:25:00.127 回答
2

这是我要做的:

  1. 下载Winspector(或使用 Spy++)
  2. 启动 Winspector,并开始观察窗口消息
  3. 安装您的驱动程序
  4. 注意 WM 指示已完成驱动程序安装

我希望我可以在#4 上更具描述性,但我不熟悉您需要的特定窗口消息。在这里查看可能的 Window Messages to expect

但是,一旦您确定要查找的正确窗口消息,然后以编程方式让您的程序等待(并处理)此 WM。CodeProject 有一篇关于如何在 C++ 中执行此操作的出色文章。就个人而言,我更喜欢在 Delphi 中进行

于 2009-02-26T05:50:13.783 回答
0

如果是网络绑定,则 RNDIS 在完成安装时会根据RNDIS 驱动程序实施指南RNDIS定义发送消息

或者

您可以通过 Devcon 实用程序(源代码可通过 MSDN 获得)以编程方式安装或查询设备列表,如示例中所示

于 2009-02-26T04:58:29.370 回答