Win32:如何确定DirectDraw是否已启用?

时间:2010-05-28 17:00:28

标签: winapi gdi+ directdraw

GDIPlus 中使用CachedBitmaps时,如果Windows视频“硬件加速”降低太多,则会出现图形损坏 - 导致 DirectDraw 被禁用:< / p>

enter image description here

有六个级别的硬件加速:

  • 禁用所有加速
  • 禁用除基本加速之外的所有加速度。 (服务器计算机上的默认值)
  • 禁用所有DirectDraw和Direct3D加速,以及所有光标和高级加速
  • 禁用所有光标和高级绘图加速
  • 禁用光标和位图加速
  • 启用所有加速(桌面计算机上的默认设置)

如果禁用DirectDraw,则在GDI +中使用DrawCachedBitmap将导致图形损坏。如果没有启用DirectDraw,我很容易使用较慢的DrawImage() API - 但我必须能够检测禁用DirectDraw。

如何以编程方式检查是否启用了 DirectDraw


问题是:dxdiag如何做到这一点:

alt text

另见

KB191660 - DirectDraw or Direct3D option is unavailable archive

3 个答案:

答案 0 :(得分:4)

如果您下载最新的DirectX SDK(我确定较旧的sdk有相似的示例),有一个查询DXDIAG信息的示例。

该示例位于(SDK Root)\ Samples \ C ++ \ Misc \ DxDiagReport

在dxdiaginfo.cpp中注意方法

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

如果您运行该程序,它会输出一个巨大的值列表。我认为你感兴趣的价值是pDisplayInfo->m_szDDStatusEnglish

答案 1 :(得分:0)

您可以在注册表中查看加速滑块值。

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

您可能需要遍历Video中的所有文件夹,因为通常会有多个条目。

Acceleration.Level Values

  • 5 禁用所有加速
  • 4 禁用除基本加速之外的所有加速度。 (服务器计算机上的默认值)
  • 3 禁用所有DirectDraw和Direct3D加速,以及所有光标和高级加速
  • 2 禁用所有光标和高级绘图加速
  • 1 禁用光标和位图加速
  • 0 启用所有加速(桌面计算机上的默认设置)

更新:

这是一个关于以编程方式更改/检查加速级别的旧线程。 http://www.autoitscript.com/forum/topic/61185-hardware-acceleration/

答案 2 :(得分:0)

您可以查询IDirectDraw interface并查看其功能。我认为如果关闭硬件加速会失败,但你可能想测试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();

不幸的是,SDK中不再包含DirectDraw文档。您可能需要较旧的版本来获取示例和头文件。