触发 Windows UAC 提示时是否有 WinAPI 消息?

Is there a WinAPI message when a Windows UAC prompt is triggered?

当触发 UAC 提示时(不是由我的应用程序触发),它会破坏某些东西(我相信它是 Direct3D 设备句柄),这会导致屏幕显示绘制的最后一帧而不是移动图像。

我没有编写显示 3D 图像的代码(它是一个插件),但是在 UAC 提示之后,如果我调整 window 图像的大小 returns。

有没有办法检测 UAC 提示关闭,以便我可以调用刷新显示的代码来补偿?

UAC 提示通常显示在安全桌面上,因此伴随着切换到不同的桌面(参见SwitchDesktop)。尽管您可以关闭此选项并且 not 有 UAC 提示会导致桌面切换,但出于安全原因它默认处于打开状态,并且几乎可以肯定这就是您看到任何视觉效果的原因中断。

您可以使用 SetWinEventHook function, listening for the EVENT_SYSTEM_DESKTOPSWITCH event,以便接收发生这种情况的通知。您会得到一些误报,因为其他情况可能会导致桌面切换,但在所有这些情况下继续并重绘可能不是什么大问题。

不过,这是一个通用的解决方案,可能无法可靠地工作。通常,您应该 能够检测到安全桌面何时可见,因为这会打开一个可能的安全漏洞。

问题没有具体说明您使用的是哪个版本的 Direct3D,但如果它是旧版本(例如 Direct3D 9),那么将处理此桌面切换,就好像渲染设备丢失一样。在您的情况下,更好的解决方案可能是为丢失设备通知安装一个处理程序 (EC_DEVICE_LOST),以便您可以正确响应,包括重新建立句柄和强制重绘。

不过,对于现代版本的 Direct3D 来说,这应该不是问题,因为它们是为了解桌面切换事件而编写的。 UAC 提示是导致桌面切换的一种常见情况;锁定工作站是另一回事。这两个都切换到安全的 Winlogon 桌面。较新的 WDDM 感知版本的 Direct3D(例如、Direct3D 9Ex 或 Direct3D 10 及更高版本)should handle this seamlessly, without losing the rendering device and without experiencing any visual disruption

虽然这个问题已经回答了一段时间,但我想指出另一个可能的解决方案。 OpenInputDesktop() will give you a handle to the currently-displayed desktop. GetThreadDesktop() will give you a handle to the desktop of a given thread. You can get your own dwThreadId by using GetCurrentThreadId(). You can get the name of a desktop by its handle using GetUserObjectInformation() 和 UOI_NAME nIndex 参数。然后检测桌面切换变得像 CurrentThreadDesktop 和 InputDesktop 的名称之间的字符串比较一样简单。