如何知道 Windows 中的初始即插即用枚举何时完成

How to know when initial plug and play enumeration is complete in Windows

我正在编写一个自动启动的 Windows 服务。看来我的服务在 Windows 完成枚举硬件之前就开始了;特别是 USB 闪存驱动器。无论如何知道 Windows 何时完成其初始硬件扫描?我很确定这是因为当扫描确定需要重新启动才能完成硬件安装时,Explorer 会显示提示。我想过很长一段时间只是睡觉。我宁愿找到一个更优雅的解决方案。我正在使用 C++ 开发 Visual Studio 2017,目标是 Windows 7 和 Windows 10.

我不知道这是否只是将我的应用程序延迟到足以让所有驱动器出现的时间,或者它是否会强制驱动器出现。这是我的解决方案:

#define _WIN32_WINNT _WIN32_WINNT_WIN7

#include <windows.h>
#include <cfgmgr32.h>
#include <tchar.h>

#pragma comment(lib,"cfgmgr32.lib")

INT _tmain(){

    DEVINST diDevice = 0;

    CONFIGRET crErr = CM_Locate_DevInst(&diDevice,nullptr,CM_LOCATE_DEVNODE_NORMAL);

    if (crErr == CR_SUCCESS){

        crErr = CM_Reenumerate_DevNode(diDevice,CM_REENUMERATE_SYNCHRONOUS);

        if (crErr == CR_SUCCESS){

            _tprintf(TEXT("Finished enum\n"));

        }else{

            _tprintf(TEXT("Enum failed: %u\n"),(UINT)CM_MapCrToWin32Err(crErr,0));

        }

    }else{

        _tprintf(TEXT("Locate failed: %u\n"),(UINT)CM_MapCrToWin32Err(crErr,0));

    }

    return 0;

}