Win32: Как определить, включен ли DirectDraw? - PullRequest
5 голосов
/ 28 мая 2010

При использовании CachedBitmaps в GDIPlus возникает графическое искажение, если видео Windows «Аппаратное ускорение» слишком сильно снижено - такое, что DirectDraw отключено :

enter image description here

Существует шесть уровней аппаратного ускорения:

  • Отключить все ускорения
  • Отключить все, кроме основных ускорений. (По умолчанию на сервере машинах)
  • Отключить все ускорения DirectDraw и Direct3D, а также все ускорения курсора и ускорения
  • Отключить все курсоры и дополнительные ускорения рисования
  • Отключить ускорение курсора и растрового изображения
  • Все ускорения включены (по умолчанию на рабочий стол машины)

Если DirectDraw отключен, то использование DrawCachedBitmap в GDI + приведет к повреждению графики. Мне достаточно легко использовать более медленный API DrawImage(), если DirectDraw не включен - но я должен иметь возможность обнаружить , что DirectDraw отключен.

Как программно проверить, включен ли DirectDraw ?


Вопрос: как dxdiag делает это:

alt text

См. Также

KB191660 - опция DirectDraw или Direct3D недоступна ( архив )

Ответы [ 3 ]

4 голосов
/ 15 ноября 2010

Если вы загрузите последний DirectX SDK (я уверен, что в старых sdk есть похожие примеры), то есть пример запроса информации DXDIAG.

Пример находится по адресу (корень SDK) \ Samples \ C ++ \ Misc \ DxDiagReport

В заметках dxdiaginfo.cpp

CDxDiagInfo::CDxDiagInfo
CDxDiagInfo::Init
CDxDiagInfo::QueryDxDiagViaDll    
CDxDiagInfo::GetDisplayInfo

Если вы запустите программу, она выдаст огромный список значений. Я думаю, что значение, которое вас интересует, составляет pDisplayInfo->m_szDDStatusEnglish

0 голосов
/ 15 ноября 2010

Вы можете запросить интерфейс IDirectDraw и посмотреть, что он делает. Я предполагаю, что произойдет сбой, если аппаратное ускорение отключено, но вы можете проверить GetCaps () или TestCooperativeLevel ().

LPDIRECTDRAW lpdd7 = NULL; // DirectDraw 7.0

// first initialize COM, this will load the COM libraries
// if they aren't already loaded
if (FAILED(CoInitialize(NULL)))
   {
   // error
   } // end if

// Create the DirectDraw object by using the
// CoCreateInstance() function
if (FAILED(CoCreateInstance(&CLSID_DirectDraw,
                         NULL, CLSCTX_ALL,
                         &IID_IDirectDraw7,
                         &lpdd7)))
   {
   // error
   }


// now before using the DirectDraw object, it must
// be initialized using the initialize method

if (FAILED(IDirectDraw7_Initialize(lpdd7, NULL)))
{
    // error
}

lpdd7->Release();
lpdd7 = NULL; // set to NULL for safety

// now that we're done with COM, uninitialize it
CoUninitialize();

К сожалению, документы DirectDraw больше не включены в SDK. Вам может понадобиться более старая версия, чтобы получить образцы и файлы заголовков.

0 голосов
/ 13 ноября 2010

Вы можете проверить в реестре значение ползунка ускорения.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video\{'some hex string'}\0000\Acceleration.Level

Вероятно, вам придется пройтись по всем папкам в Video, так как обычно там более одной записи.

Ускорение. Уровневые значения

  • 5 Отключить все ускорения
  • 4 Отключить все, кроме базовых ускорений. (По умолчанию на серверах)
  • 3 Отключить все ускорения DirectDraw и Direct3D, а также все ускорения курсора и ускорения
  • 2 Отключить все ускорения курсора и рисования
  • 1 Отключение ускорений курсора и растрового изображения
  • 0 Все ускорения включены (по умолчанию на настольных компьютерах)

Обновление:

Вот старая ветка о программном изменении / проверке уровня ускорения. http://www.autoitscript.com/forum/topic/61185-hardware-acceleration/

...