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

当一个UAC提示被触发(不是由我的应用程序),它打破了某些事情(我相信它是Direct3D设备句柄),这导致屏幕显示最后一帧画出,而不是一个运动图像。

我没有编写显示3D图像的代码(这是一个插件),但在UAC提示后,如果我调整窗口的大小,图像将返回。

有没有办法检测UAC提示closures,所以我可以调用代码,刷新显示器来弥补?

UAC提示通常显示在安全桌面上,因此会伴随切换到不同的桌面(参见SwitchDesktop )。 尽管您可以关闭此选项,但不会出现UAC提示导致桌面切换的情况,但出于安全原因,默认情况下此选项处于打开状态,几乎可以肯定是您看到任何视觉干扰的原因。

您可以使用SetWinEventHook函数来侦听EVENT_SYSTEM_DESKTOPSWITCH事件 ,以便接收已发生的通知。 你会得到一些误报,因为其他情况可能导致桌面切换,但是在所有这些情况下重新绘制可能不是什么大事。

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

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

但是,现代版本的Direct3D不应该是一个问题,因为它们是为了了解桌面切换事件而编写的。 UAC提示是导致桌面切换的一种常见情况; 锁定工作站是另一回事。 这两个都切换到安全的Winlogon桌面。 Direct3D的较新的支持WDDM的版本( 例如 ,Direct3D 9Ex或Direct3D 10及更高版本) 应能够无缝处理,而不会丢失渲染设备,也不会出现任何视觉中断 。