Win32:如何确定DirectDraw是否已启用?
在GDIPlus中使用CachedBitmaps
时,如果Windows视频“硬件加速”降低太多,会导致图形损坏 - 例如禁用DirectDraw :
替代文字http://i48.tinypic.com/10qeaeb.jpg
有六个级别的硬件加速:
如果DirectDraw被禁用,那么在GDI +中使用DrawCachedBitmap
将导致图形损坏。 如果DirectDraw未启用,使用较慢的DrawImage()
API很容易 - 但我必须能够检测到DirectDraw已禁用。
我如何编程检查DirectDraw是否启用?
问题是:dxdiag如何做到这一点:
也可以看看
KB191660 - DirectDraw或Direct3D选项不可用
如果你下载最新的DirectX SDK(我确定老的SDK有类似的例子),有一个查询DXDIAG信息的例子。
该示例位于(SDK根) Samples C ++ Misc DxDiagReport
在注释的dxdiaginfo.cpp方法中
CDxDiagInfo::CDxDiagInfo
CDxDiagInfo::Init
CDxDiagInfo::QueryDxDiagViaDll
CDxDiagInfo::GetDisplayInfo
如果你运行该程序,它会输出一个巨大的值列表。 我认为你感兴趣的价值是pDisplayInfo->m_szDDStatusEnglish
您可以检查注册表中的加速滑块值。
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlVideo{'some hex string'} 000Acceleration.Level
您可能需要遍历Video
所有文件夹,因为通常有多个条目。
加速度。价值
更新:
这是一个关于编程改变/检查加速度级别的较旧的线程。 http://www.autoitscript.com/forum/topic/61185-hardware-acceleration/
您可以查询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中。 您可能需要较旧的版本才能获取样本和头文件。
链接地址: http://www.djcxy.com/p/50341.html