每个监视器DPI-Aware:使用NVIDIA Optimus的黑色窗口故障

时间:2016-07-03 16:27:32

标签: c++ winapi direct2d multiple-monitors optimus

我想制作Per-Monitor DPI-Aware Direct2D应用程序。我已按照"First Direct2D Program"中的说明扩展了Microsoft Kenny Kerr's MSDN article示例来处理WM_DPICHANGED。当两台显示器都使用一块显卡时,这种情况很有效,但在使用我的笔记本电脑的NVIDIA Optimus设置时会出现故障。

我可以通过以下步骤运行Per-Monitor Aware WPF Sample来重现同样的故障:

  • 每台显示器上的DPI比例因子不同。
  • 启用Optimus(集成显卡上的笔记本电脑显示,Quadro显卡上的外接显示器)
  • 应用程序在主显示屏上启动 - 右侧的外部显示器。
  • 将其拖到左侧,并正确处理DPI更改。
  • 将其拖回右侧。当它处理DPI更改时,右侧监视器上的窗口部分变为黑色。左边的部分仍然正确绘制。

(见video of this bug

我在上面的示例应用程序中只看到了这个错误,当我尝试将Kerr的WM_DPICHANGED处理程序添加到一个更简单的示例时。可疑的是,我已经看到其他应用程序(Chrome,Visual Studio本身)显示类似的黑色窗口,但只是暂时的,如果我在显示器之间拖动并且非常快速地最大化它们。

那么 - 是否有人熟悉这个故障?是我的显示驱动程序中的一些错误?或者是否有其他应用程序要做的事情来纠正它,示例代码没有?

1 个答案:

答案 0 :(得分:3)

你说NVIDIA Optimus?那些司机是犯罪的错误。尝试使用D2D1_PRESENT_OPTIONS_RETAIN_CONTENTS标志初始化渲染目标。

在2014年我完成Paint.NET 4.0时,这让我永远想起了,我仍然在代码中发表评论警告我永远不要把它关掉:

private PresentOptions hwndPresentOptions = 
    PresentOptions.Immediately | 
    PresentOptions.RetainContents; // If we don't use RetainContents, then we get awful
                                   // black flickering and mouse trails on some hardware
                                   // (e.g. NVIDIA Optimus)