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

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

替代文字http://i48.tinypic.com/10qeaeb.jpg

有六个级别的硬件加速:

  • 禁用所有加速
  • 禁用所有基本加速度。 (在服务器机器上默认)
  • 禁用所有DirectDraw和Direct3D加速,以及所有光标和高级加速
  • 禁用所有游标和高级绘图加速
  • 禁用光标和位图加速度
  • 所有加速度都已启用( 桌面计算机上的默认设置)
  • 如果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所有文件夹,因为通常有多个条目。

    加速度。价值

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

    这是一个关于编程改变/检查加速度级别的较旧的线程。 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

    上一篇: Win32: How to determine if DirectDraw is enabled?

    下一篇: Image loses quality with cv2.warpPerspective