UE4获取硬件显卡信息

参考文档:http://blog.csdn.net/caoshangpa/article/details/78623044
 http://blog.csdn.net/tody_guo/article/details/26365573

#include <DXGI.h>   

方法一:

/****.h 获取显卡信息*****/
	UFUNCTION(BlueprintCallable, Category = "DCFUtil")
		static void GetDisplayCardInfo();
void UDCFBlueprintFunctionLibrary::GetDisplayCardInfo()
{
	//ASSERT(pDXGIFactory != 0);
	HINSTANCE hDXGI = LoadLibrary(L"dxgi.dll");

	typedef HRESULT(WINAPI* LPCREATEDXGIFACTORY)(REFIID, void**);

	LPCREATEDXGIFACTORY pCreateDXGIFactory = nullptr;
	IDXGIFactory* pDXGIFactory = nullptr;

	// We prefer the use of DXGI 1.1  
	pCreateDXGIFactory = (LPCREATEDXGIFACTORY)GetProcAddress(hDXGI, "CreateDXGIFactory1");

	if (!pCreateDXGIFactory)
	{
		pCreateDXGIFactory = (LPCREATEDXGIFACTORY)GetProcAddress(hDXGI, "CreateDXGIFactory");

		if (!pCreateDXGIFactory)
		{
			FreeLibrary(hDXGI);
			//wprintf(L"ERROR: dxgi.dll missing entry-point\n");
			UE_LOG(LogClass, Log, TEXT("ERROR: dxgi.dll missing entry-point\n"));
			return ;
		}
	}

	HRESULT hr = pCreateDXGIFactory(__uuidof(IDXGIFactory), (LPVOID*)&pDXGIFactory);

	if (!pDXGIFactory)
		return;

	for (UINT index = 0; ; ++index)
	{
		IDXGIAdapter* pAdapter = nullptr;
		HRESULT hr = pDXGIFactory->EnumAdapters(index, &pAdapter);
		if (FAILED(hr)) // DXGIERR_NOT_FOUND is expected when the end of the list is hit  
			break;

		DXGI_ADAPTER_DESC desc;
		memset(&desc, 0, sizeof(DXGI_ADAPTER_DESC));
		if (SUCCEEDED(pAdapter->GetDesc(&desc)))
		{
    //显卡名称
			UE_LOG(LogClass, Log, TEXT("Adapter: [%u] %s\n"), index, desc.Description);
     
			for (UINT iOutput = 0; ; ++iOutput)
			{
				IDXGIOutput* pOutput = nullptr;
				hr = pAdapter->EnumOutputs(iOutput, &pOutput);
				if (FAILED(hr)) // DXGIERR_NOT_FOUND is expected when the end of the list is hit  
					break;

				DXGI_OUTPUT_DESC outputDesc;
				memset(&outputDesc, 0, sizeof(DXGI_OUTPUT_DESC));
				if (SUCCEEDED(pOutput->GetDesc(&outputDesc)))
				{
					UE_LOG(LogClass, Log, TEXT("hMonitor: 0x%0.8Ix\n"), (DWORD_PTR)outputDesc.Monitor);
					UE_LOG(LogClass, Log, TEXT("hMonitor Device Name: %s\n"), outputDesc.DeviceName);
				}

				pOutput->Release();
			}
    //显示内存
			UE_LOG(LogClass,Log,TEXT("Dedicated Video Memory: %Iu MB\n"	"Dedicated System Memory: %Iu MB\n"	"Shared System Memory: %Iu MB\n"), desc.DedicatedVideoMemory / 1024 / 1024, desc.DedicatedSystemMemory / 1024 / 1024, desc.SharedSystemMemory / 1024 / 1024);
		}

		pAdapter->Release();
	}
}


方法二:

//.cpp
static string WStringToString(const wstring &wstr);

/****获取显卡信息*****/
UFUNCTION(BlueprintCallable, Category = "DCFUtil")
	static int GetDisplayCardInfo2();
std::string UDCFBlueprintFunctionLibrary::WStringToString(const std::wstring & wstr)
{
	std::string str(wstr.length(), ' ');
	std::copy(wstr.begin(), wstr.end(), str.begin());
	return str;
}

int UDCFBlueprintFunctionLibrary::GetDisplayCardInfo2()
{
	// 参数定义    
	typedef HRESULT(WINAPI* LPCREATEDXGIFACTORY)(REFIID, void**);

	LPCREATEDXGIFACTORY pCreateDXGIFactory = nullptr;
	IDXGIFactory* pDXGIFactory = nullptr;
	IDXGIAdapter * pAdapter = nullptr;
	TArray<IDXGIAdapter*> vAdapters;            // 显卡    

	// 显卡的数量    
	int iAdapterNum = 0;

	HINSTANCE hDXGI = LoadLibrary(L"dxgi.dll");

	// 创建一个DXGI工厂    
	pCreateDXGIFactory = (LPCREATEDXGIFACTORY)GetProcAddress(hDXGI, "CreateDXGIFactory1");
	if (!pCreateDXGIFactory)
	{
		pCreateDXGIFactory = (LPCREATEDXGIFACTORY)GetProcAddress(hDXGI, "CreateDXGIFactory");

		if (!pCreateDXGIFactory)
		{
			FreeLibrary(hDXGI);
			UE_LOG(LogClass, Log, TEXT("ERROR: dxgi.dll missing entry-point\n"));
			return -1;
		}
	}
	HRESULT hr = pCreateDXGIFactory(__uuidof(IDXGIFactory), (LPVOID*)&pDXGIFactory);

	if (FAILED(hr))
		return -1;

	// 枚举适配器    
	while (pDXGIFactory->EnumAdapters(iAdapterNum, &pAdapter) != DXGI_ERROR_NOT_FOUND)
	{
		vAdapters.Push(pAdapter);
		++iAdapterNum;
	}

	// 信息输出     
	UE_LOG(LogClass, Log, TEXT("===============获取到 %d 块显卡===============\n"), iAdapterNum);

	for (size_t i = 0; i < vAdapters.Num(); i++)
	{
		// 获取信息    
		DXGI_ADAPTER_DESC adapterDesc;
		vAdapters[i]->GetDesc(&adapterDesc);
		wstring aa(adapterDesc.Description);
		std::string bb = WStringToString(aa);
		FString fbb = bb.c_str();
		// 输出显卡信息    
		UE_LOG(LogClass, Log, TEXT("系统视频内存: %d M\n"), adapterDesc.DedicatedSystemMemory / 1024 / 1024);
		UE_LOG(LogClass, Log, TEXT("专用视频内存: %d M\n"), adapterDesc.DedicatedVideoMemory / 1024 / 1024);
		UE_LOG(LogClass, Log, TEXT("共享系统内存: %d M\n"), adapterDesc.SharedSystemMemory / 1024 / 1024);
		UE_LOG(LogClass, Log, TEXT("设备描述: %s\n"), *fbb);
		UE_LOG(LogClass, Log, TEXT("设备ID: %d\n"), adapterDesc.DeviceId);
		UE_LOG(LogClass, Log, TEXT("PCI ID修正版本: %d\n"), adapterDesc.Revision);
		UE_LOG(LogClass, Log, TEXT("子系统PIC ID: %d\n"), adapterDesc.SubSysId);
		UE_LOG(LogClass, Log, TEXT("厂商编号: %d\n"), adapterDesc.VendorId);

		// 输出设备    
		IDXGIOutput * pOutput;
		TArray<IDXGIOutput*> vOutputs;
		// 输出设备数量    
		int iOutputNum = 0;
		while (vAdapters[i]->EnumOutputs(iOutputNum, &pOutput) != DXGI_ERROR_NOT_FOUND)
		{
			vOutputs.Push(pOutput);
			iOutputNum++;
		}

		UE_LOG(LogClass, Log, TEXT("-----------------------------------------"));
		UE_LOG(LogClass, Log, TEXT("获取到 %d 个显示设备\n"), iOutputNum);

		for (size_t n = 0; n < vOutputs.Num(); n++)
		{
			// 获取显示设备信息    
			DXGI_OUTPUT_DESC outputDesc;
			vOutputs[n]->GetDesc(&outputDesc);

			// 获取设备支持    
			UINT uModeNum = 0;
			DXGI_FORMAT format = DXGI_FORMAT_R8G8B8A8_UNORM;
			UINT flags = DXGI_ENUM_MODES_INTERLACED;

			vOutputs[n]->GetDisplayModeList(format, flags, &uModeNum, 0);
			DXGI_MODE_DESC * pModeDescs = new DXGI_MODE_DESC[uModeNum];
			vOutputs[n]->GetDisplayModeList(format, flags, &uModeNum, pModeDescs);

			UE_LOG(LogClass, Log, TEXT("显示设备名称: %s \n"), outputDesc.DeviceName);
			UE_LOG(LogClass, Log, TEXT("显示设备当前分辨率: %d * %d \n"), outputDesc.DesktopCoordinates.right - outputDesc.DesktopCoordinates.left, outputDesc.DesktopCoordinates.bottom - outputDesc.DesktopCoordinates.top);

			// 所支持的分辨率信息    
			UE_LOG(LogClass, Log, TEXT("分辨率信息:"));
			for (UINT m = 0; m < uModeNum; m++)
			{
				UE_LOG(LogClass, Log, TEXT("== 分辨率: %d * %d      刷新率: %d\n"), pModeDescs[m].Width, pModeDescs[m].Width, (pModeDescs[m].RefreshRate.Numerator) / (pModeDescs[m].RefreshRate.Denominator));
			}
		}
		vOutputs.Empty();

	}
	vAdapters.Empty();

	return 0;
}




  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值