Когда вы вызываете CreateDevice, обязательно используйте индекс целевого монитора. Стандартное значение D3DADAPTER_DEFAULT - просто 0, который является основным монитором. DirectX в этом смысле немного запутан, но если окно находится на мониторе, отличном от указанного в CreateDevice, то он будет автоматически выполнять рендеринг в буфере кадров, предназначенном для первого монитора, а затем копировать буфер в буфер кадров на втором мониторе с помощью окна ОС. менеджер.
Итак, быстрое и грязное решение состоит в том, чтобы вместо этого использовать CreateDevice (1, ...), поскольку это почти всегда так, как индексируется установка с двумя мониторами.
Более надежное решение - использовать MonitorFromWindow (hwnd), чтобы найти монитор, который покрывает окно больше всего, а затем перебрать доступные адаптеры d3d, ища тот, который возвращает тот же дескриптор монитора, используя GetAdapterMonitor (). Если у вас есть система с более чем двумя мониторами, или вы заранее не знаете, какой монитор вам нужен, и у вас просто HWND, вам нужен более длинный метод.