Я хотел бы создать приложение Direct-Aware Direct2D для каждого монитора. Я продлил Microsoft «Первая программа Direct2D» пример для обработки WM_DPICHANGED
как объяснено в Статья Кенни Керра по MSDN. Это работает, когда оба монитора используют одну видеокарту, но страдает от сбоя при использовании установки NVIDIA Optimus на моем ноутбуке.
Я могу воспроизвести тот же глюк, запустив Пример WPF для каждого монитора с этими шагами:
(Увидеть видео этой ошибки)
Я видел эту ошибку только в приведенном выше примере приложения, и когда я пытаюсь добавить обработчик Kerr WM_DPICHANGED в более простой пример. Я подозрительно иметь Видно, что другие приложения (Chrome, сама Visual Studio) показывают подобное черное окно, но только временно, если я перетаскиваю между мониторами и очень быстро их увеличиваю.
Итак — кто-нибудь знаком с этим глюком? Это какая-то ошибка в моих драйверах дисплея? Или есть что-то, что другие приложения делают, чтобы исправить это, чего нет в примере кода?
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)
Других решений пока нет …