c++ - resolucion - Obtención de ppp reales de pantalla/ppi bajo windows
resolucion de pantalla windows 10 1366x768 (4)
Creo que lo que buscas es:
GetDeviceCaps(hdcScreen, LOGPIXELSX); GetDeviceCaps(hdcScreen, LOGPIXELSY);
Me gustaría obtener la pantalla real dpi / ppi, no la configuración dpi usada para fuente en C ++.
Lo intenté con los siguientes códigos:
Versión 1, informa 72 ppp, lo cual es incorrecto.
SetProcessDPIAware(); //true
HDC screen = GetDC(NULL);
double hSize = GetDeviceCaps(screen, HORZSIZE);
double vSize = GetDeviceCaps(screen, VERTSIZE);
double hRes = GetDeviceCaps(screen, HORZRES);
double vRes = GetDeviceCaps(screen, VERTRES);
double hPixelsPerInch = hRes / hSize * 25.4;
double vPixelsPerInch = vRes / vSize * 25.4;
ReleaseDC(NULL, screen);
return (hPixelsPerInch + vPixelsPerInch) * 0.5;
La versión 2 informa de 96 ppp, que es la configuración de ppp de Windows para la fuente, pero no la ppp real de la pantalla.
SetProcessDPIAware(); //true
HDC screen = GetDC(NULL);
double hPixelsPerInch = GetDeviceCaps(screen,LOGPIXELSX);
double vPixelsPerInch = GetDeviceCaps(screen,LOGPIXELSY);
ReleaseDC(NULL, screen);
return (hPixelsPerInch + vPixelsPerInch) * 0.5;
Estoy sinceramente confundido por las respuestas aquí.
Microsoft tiene un método GetDpiForMonitor:
https://msdn.microsoft.com/en-us/library/windows/desktop/dn280510(v=vs.85).aspx
Y los monitores exponen sus dimensiones físicas a las herramientas. Puede leer el ancho y la altura de sus monitores, en centímetros, utilizando la herramienta HWiNFO64. Entonces, si lo están obteniendo (¿DDI?), Es lógico que usted mismo pueda acceder a esa información.
Incluso una publicación diferente de Desbordamiento de pila menciona el uso de WmiMonitorBasicDisplayParams para obtener los datos.
Cómo obtener el tamaño del monitor
Así que el post superior es plano, 100%, equivocado.
Lo que está pidiendo, lamentablemente, no es posible en el caso general.
Windows no sabe el tamaño de la pantalla física. Windows puede saber que su pantalla tiene 1024x768 píxeles, pero no sabe qué tan grande es la pantalla en realidad. Puede sacar el cable de su antigua pantalla de 13 "y conectarlo a un monitor de 19" sin cambiar la resolución. El DPI sería diferente, pero Windows no se dará cuenta de que ha cambiado los monitores.
Puede obtener las dimensiones físicas y los DPI reales para una impresora (suponiendo que el controlador no está mintiendo), pero no para una pantalla. Al menos no de forma fiable.
ACTUALIZADO
Como otros lo han señalado, existen estándares para la comunicación bidireccional entre los monitores más nuevos y el sistema operativo (EDID), que podrían hacer que esta información esté disponible para algunos dispositivos. Pero todavía no he encontrado un monitor que proporcione esta información.
Incluso si el EDID estuviera disponible universalmente, aún no puede resolverse en el caso general, ya que la pantalla podría ser un proyector de video, donde el DPI dependería del zoom, el enfoque, el tipo de lente y la distancia de alcance. Es muy poco probable que un proyector sepa la distancia de alcance, por lo que no hay forma de que informe el DPI real.
Se obtiene que la información de DPI produce un valor exacto usando el método a continuación.
ID2D1Factory* m_pDirect2dFactory;
D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_pDirect2dFactory);
FLOAT dpiX, dpiY;
m_pDirect2dFactory->GetDesktopDpi( &dpiX, &dpiY );