如何找出运行 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 的机器的当前颜色深度?的主要内容,如果未能解决你的问题,请参考以下文章

如何找出访问 SQL Server 的用户名和机器名

如何找出当前是不是在 SwiftUI 中选择了视图

如何摆脱 R 中 geom_point 中填充较深颜色的内点?

如何找出当前在 OS X 下运行的 Mono 应用程序?

如何从 VSTO 插件中找出当前版本的 Outlook?

悬停时如何停止当前正在运行的动画并更改样式