QueryDisplayConfig 不返回任何记录的值

QueryDisplayConfig does not return any of its documented values

本文关键字:记录 任何 返回 QueryDisplayConfig      更新时间:2023-10-16

系统启动时,我有一个Windows服务,该服务正在与其系统和用户进程一起加载。加载用户进程后(作为管理员(,我立即调用 QueryDisplayConfig 来检查显示特定信息。问题是,有时,只有有时 QueryDisplayConfig 返回的值既不是其可能的返回值。

解决方法是在调用 QueryDisplayConfig 打开和关闭 Windows 注册表之前。这很有趣,但不知何故它解决了问题。我想知道 regedit 是什么.exe它是否迫使 Windows 更新注册表。

这个问题

可能没有解决方案,我将不得不求助于以下解决方案,这也是一种解决方案:

LONG lResult = QueryDisplayConfig(QDC_DATABASE_CURRENT, &PathArraySize, PathArray.data(), &ModeArraySize, ModeArray.data(), &CurrentTopology);
while (lResult != ERROR_SUCCESS &&
       lResult != ERROR_INVALID_PARAMETER &&
       lResult != ERROR_NOT_SUPPORTED &&
       lResult != ERROR_ACCESS_DENIED &&
       lResult != ERROR_GEN_FAILURE &&
       lResult != ERROR_INSUFFICIENT_BUFFER)
{
    Sleep(300);
    lResult = QueryDisplayConfig(QDC_DATABASE_CURRENT, &PathArraySize, PathArray.data(), &ModeArraySize, ModeArray.data(), &CurrentTopology);
}

我宁愿不诉诸这种丑陋的解决方法,而是以编程方式更新/刷新 Windows 注册表。

如果我

关闭/重新打开 REGEDIT,有时在通过 REGEDIT 搜索注册表时会得到不同的结果,如果我不这样做。这是在WS08R2上。我以为这是REGEDIT本身的问题。现在听起来像是一个可能的Windows错误。如果是这种情况,那就没有任何漂亮的解决方法了。

基于Windows内部,注册表在内存中操作。因此,任何对值/键的查询都将始终来自内存。如果值/键当前不在内存中,则会首先读取它,但读取后的代码路径与它已经在内存中一样。磁盘配置单元不应比内存中配置单元的该部分更新。

因此,根据记录的设计,"刷新"注册表并没有真正的意义。因此,我不希望有一个 API 来"刷新"。

我认为最不丑陋的方法(取决于你的审美意识(是尝试模仿REGEDIT所做的。当你关闭它时,它会保存在注册表中上次浏览的位置,所以下次你运行REGEDIT时,它将(至少(打开并读取填充REGEDIT窗口所需的任何配置单元,键和值。

因此,您可以在下次从QueryDisplayConfig获得意外值时运行REGEDIT,并查看正在显示的键和值。然后将其编码到您的程序中。当然,您实际上不必显示值,只需打开并读取它们即可。