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

Lac*_*ack 6 c++ winapi multiple-monitors direct2d optimus

我想制作一个Per-Monitor DPI-Aware Direct2D应用程序.我已按照Kenny Kerr的MSDN文章中的解释,扩展了Microsoft的"First Direct2D Program"示例.当两台显示器都使用一块显卡时,这种方法很有效,但在使用我的笔记本电脑的NVIDIA Optimus设置时会出现故障.WM_DPICHANGED

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

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

(见这个bug的视频)

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

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

Ric*_*ter 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)
Run Code Online (Sandbox Code Playgroud)