当触发UAC提示时(不是我的应用程序),它会破坏某些东西(我相信它是Direct3D设备句柄),这会导致屏幕显示最后一帧而不是动态图像。
我没有编写显示3D图像的代码(它是一个插件),但是在UAC提示之后,如果我调整窗口大小,图像就会返回。
有没有办法检测UAC提示关闭所以我可以调用代码来刷新显示以补偿?
答案 0 :(得分:6)
UAC提示通常显示在安全桌面上,因此它伴随着切换到其他桌面(参见SwitchDesktop
)。虽然您可以关闭此选项并且不让UAC提示导致桌面切换,但出于安全原因,它默认处于启用状态,几乎可以肯定是您看到任何类型的视觉中断的原因。 / p>
您可以使用SetWinEventHook
function,聆听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。