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

bLi*_*ght 4 windows winapi uac direct3d

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

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

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

Cod*_*ray 6

UAC提示通常显示在安全桌面上,因此它伴随着切换到不同的桌面(参见SwitchDesktop).虽然您可以关闭此选项并且没有 UAC提示导致桌面切换,但出于安全原因它默认处于启用状态,并且几乎可以肯定是您看到任何类型的视觉中断的原因.

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

但这是一般解决方案,可能无法可靠地运行.通常,您不应该能够检测到安全桌面何时可见,因为这会打开可能的安全漏洞.

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

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