Directx C++;执行DxDiag的函数;Direct3D加速“;侦查

Directx C++;执行DxDiag的函数;Direct3D加速“;侦查,directx,directdraw,Directx,Directdraw,Microsoft DxDiag可以检测系统是否具有“Direct3D加速” 如果系统没有此功能,DxDiag将写入“Direct3D加速不可用”,并在控制台中写入“Direct3D功能不可用。您应该验证驱动程序是否为硬件制造商提供的最终版本。” 我也喜欢用C++函数。 我做了一些测试,下面的函数似乎可以完成这项工作 还有更好的主意吗 多谢各位 亚历山德罗 #include <ddraw.h> #include <atlbase.h> bool has3D() {

Microsoft DxDiag可以检测系统是否具有“Direct3D加速”

如果系统没有此功能,DxDiag将写入“Direct3D加速不可用”,并在控制台中写入“Direct3D功能不可用。您应该验证驱动程序是否为硬件制造商提供的最终版本。”

我也喜欢用C++函数。 我做了一些测试,下面的函数似乎可以完成这项工作

还有更好的主意吗

多谢各位

亚历山德罗

#include <ddraw.h>
#include <atlbase.h>

bool has3D()
{
   CComPtr< IDirectDraw > dd;
   HRESULT hr = ::DirectDrawCreate( 0, &dd, 0 );
   if ( hr != DD_OK ) return false;

   DDCAPS hel_caps, hw_caps;
   ::ZeroMemory( &hel_caps, sizeof( DDCAPS ) );
   ::ZeroMemory( &hw_caps, sizeof( DDCAPS ) );
   hw_caps.dwSize = sizeof( DDCAPS );
   hel_caps.dwSize = sizeof( DDCAPS );
   hr = dd->GetCaps( &hw_caps, &hel_caps );
   if ( hr != DD_OK ) return false;

   return (hw_caps.dwCaps & DDCAPS_3D) && (hel_caps.dwCaps & DDCAPS_3D);
}
#包括
#包括
boolhas3d()
{
CComPtrdd;
HRESULT hr=::DirectDrawCreate(0,&dd,0);
如果(hr!=DD_OK)返回false;
DDCAPS hel_caps,hw_caps;
::零内存(&hel_caps,sizeof(DDCAPS));
::零内存(&hw_caps,sizeof(DDCAPS));
hw_caps.dwSize=sizeof(DDCAPS);
hel_caps.dwSize=尺寸(DDCAPS);
hr=dd->GetCaps(&hw_caps,&hel_caps);
如果(hr!=DD_OK)返回false;
返回(hw_caps.dwCaps和DDCAPS_3D)和(hel_caps.dwCaps和DDCAPS_3D);
}

您可以通过和访问DX Diag

由于DirectDraw现在已被弃用,因此最好使用Direct3D功能

如果目的是检测应用程序是否可以使用3D加速,我将初始化Direct3D,然后检查是否可以使用

LPDIRECT3D9 d3d = Direct3DCreate9( D3D_SDK_VERSION );

D3DCAPS9 caps;

if ( FAILED(d3d->GetDeviceCaps(D3DADAPTER_DEFAULT , D3DDEVTYPE_HAL, &caps)) )
{
    return false;    
}
通过选中Direct3D选项卡中的“仅软件”复选框,可以在DirectX控制面板中强制进行软件渲染,从而检查此代码的有效性。
在选中和不选中复选框的情况下测试代码,看看它是否适合您的需要