在GDIPlus中使用GDIPlus时,如果Windows视频“硬件加速”降低得太低,就会出现图形损坏--比如禁用DirectDraw:

硬件加速有六个层次:
如果禁用DirectDraw,那么在GDI+中使用DrawCachedBitmap将导致图形损坏。如果没有启用DrawImage(),我可以很容易地使用较慢的DirectDraw API --但我必须能够检测到是否禁用了DirectDraw。
如何以编程方式检查是否启用了DirectDraw?
问题是: dxdiag是如何做到这一点的:

另请参阅
KB191660 - DirectDraw或Direct3D选项不可用 (https://archive.fo/wuHKI)
发布于 2010-11-15 03:51:48
如果您下载最新的DirectX SDK (我肯定旧的sdk有类似的示例),就有一个查询DXDIAG信息的例子。
该示例位于(SDK )\Samples\C++\Misc\DxDiagReport
在dxdiaginfo.cpp中注意的方法
CDxDiagInfo::CDxDiagInfo
CDxDiagInfo::Init
CDxDiagInfo::QueryDxDiagViaDll
CDxDiagInfo::GetDisplayInfo如果您运行该程序,它将产生一个巨大的值列表。我认为你感兴趣的价值是pDisplayInfo->m_szDDStatusEnglish
发布于 2010-11-13 02:24:30
您可以检查注册表中的加速滑块值。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video\{'some hex string'}\0000\Acceleration.Level您可能需要遍历Video中的所有文件夹,因为通常有多个条目。
Acceleration.Level值
更新:
下面是一个关于以编程方式更改/检查加速级别的旧线程。http://www.autoitscript.com/forum/topic/61185-hardware-acceleration/
发布于 2010-11-15 09:10:30
您可以查询一个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中。您可能需要一个较早的版本来获取示例和头文件。
https://stackoverflow.com/questions/2930974
复制相似问题