2017-10-19 76 views
4

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

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

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

回答

6

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

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

虽然这是一个通用的解决方案,并且可能无法可靠地工作。一般来说,您并不是假设能够检测到安全桌面何时可见,因为这会打开一个可能的安全漏洞。

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

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

相关问题