5

CachedBitmapsGDIPlus中使用时,如果 Windows 视频“硬件加速”降低太多会导致图形损坏 - 例如禁用DirectDraw :

在此处输入图像描述

硬件加速有六个级别:

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

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

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


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

替代文字

也可以看看

KB191660 - DirectDraw 或 Direct3D 选项不可用 存档

4

3 回答 3

4

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

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

在 dxdiaginfo.cpp 方法中注意

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

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

于 2010-11-15T03:51:48.477 回答
0

您可以检查注册表中的加速度滑块值。

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

您可能必须遍历其中的所有文件夹,Video因为通常有多个条目。

Acceleration.Level 值

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

更新:

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

于 2010-11-13T02:24:30.347 回答
0

您可以查询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();

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

于 2010-11-15T09:10:30.420 回答