2009-08-14 10 views

risposta

10

Su Windows è possibile utilizzare GetDeviceCaps con il flag BITSPIXEL ma è necessario prima uno schermo DC (GetDC potrebbe recuperarne uno).

HDC dc = GetDC(NULL); 
int bitsPerPixel = GetDeviceCaps(dc, BITSPIXEL); 
ReleaseDC(NULL, dc); 
+0

funziona perfettamente - grazie mille! –

3

È possibile farlo utilizzando 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. 
+4

API come questo mi fanno con gioia ricordo perché sono passato allo sviluppo .NET :) –

+0

hehehehe ... La sua non è una vasta importo più facile l'accesso a WMI da mente NET;) – Goz

0

chiamata GetDeviceCaps() per recuperare BITSPIXEL

non è un "per-machine" proprietà in realtà, è necessario un HDC.

3

Si dovrebbe essere in grado di ottenere i bit per valore di pixel utilizzando

HDC hdc = GetDC(NULL); 
int colour_depth = GetDeviceCaps(hdc,BITSPIXEL); 
ReleaseDC(NULL,hdc); 
Problemi correlati