如何找出运行 vista/w7 的机器的当前颜色深度?
Posted
技术标签:
【中文标题】如何找出运行 vista/w7 的机器的当前颜色深度?【英文标题】:How can I find out the current color depth of a machine running vista/w7? 【发布时间】:2010-11-19 14:05:12 【问题描述】:我想检查操作系统的当前颜色深度,以在用户尝试使用“错误”颜色深度(使用 c++ 和 Qt)运行我的应用程序时警告用户。
我想有一个 win api 调用来获取此信息,但我找不到任何东西。
【问题讨论】:
【参考方案1】:在 Windows 上,您可以使用带有 BITSPIXEL
标志的 GetDeviceCaps
,但您首先需要一个屏幕 DC(GetDC
可以为您获取一个)。
HDC dc = GetDC(NULL);
int bitsPerPixel = GetDeviceCaps(dc, BITSPIXEL);
ReleaseDC(NULL, dc);
【讨论】:
【参考方案2】:您可以使用 WMI 来做到这一点。
int bitDepth = -1;
hr = CoInitializeEx( NULL, COINIT_MULTITHREADED );
if ( SUCCEEDED( hr ) )
// hr = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL );
if ( SUCCEEDED( hr ) )
IWbemLocator* pLoc = NULL;
hr = CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (void**)&pLoc );
if ( SUCCEEDED( hr ) )
IWbemServices* pSvc = NULL;
hr = pLoc->ConnectServer( BSTR( L"ROOT\\CIMV2" ), NULL, NULL, 0, NULL, 0, 0, &pSvc );
if ( SUCCEEDED( hr ) )
hr = CoSetProxyBlanket( pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE );
if ( SUCCEEDED( hr ) )
IEnumWbemClassObject* pEnumerator = NULL;
hr = pSvc->ExecQuery( L"WQL", L"SELECT * FROM Win32_DisplayConfiguration", WBEM_FLAG_FORWARD_ONLY/* | WBEM_FLAG_RETURN_IMMEDIATELY*/, NULL, &pEnumerator );
if ( SUCCEEDED( hr ) )
IWbemClassObject* pDisplayObject = NULL;
ULONG numReturned = 0;
hr = pEnumerator->Next( WBEM_INFINITE, 1, &pDisplayObject, &numReturned );
if ( numReturned != 0 )
VARIANT vtProp;
pDisplayObject->Get( L"BitsPerPel", 0, &vtProp, 0, 0 );
bitDepth = vtProp.uintVal;
pEnumerator->Release();
pSvc->Release();
pLoc->Release();
// bitDepth wshould now contain the bitDepth or -1 if it failed for some reason.
【讨论】:
这样的 API 让我很高兴地记得我为什么转向 .NET 开发 :) hehehehe ... 从 .NET 头脑中访问 WMI 并不是一件容易的事;)【参考方案3】:您应该能够使用以下方法获取每像素值的位数
HDC hdc = GetDC(NULL);
int colour_depth = GetDeviceCaps(hdc,BITSPIXEL);
ReleaseDC(NULL,hdc);
【讨论】:
【参考方案4】:调用GetDeviceCaps()
找回BITSPIXEL
这实际上不是“每台机器”属性,您需要一个 HDC。
【讨论】:
以上是关于如何找出运行 vista/w7 的机器的当前颜色深度?的主要内容,如果未能解决你的问题,请参考以下文章