¿Cómo consultar la resolución de hardware NATIVE del monitor primario en Windows?

Necesito encontrar la “mejor” resolución nativa para un monitor LCD conectado en Windows (que luego estableceré mediante progtwigción y sabré cómo hacerlo). Permítame repetir que no necesito la resolución actual de Windows, ni tengo que preocuparme. sobre CRTs / proyectores.

Lo he visto funcionar con este progtwig, así que sé que es posible a pesar de los detractores: http://www.entechtaiwan.com/util/moninfo.shtm

Sería mejor hablar directamente con el monitor y consultar la información de EDID. Sin embargo, he visto que está almacenado en caché en el registro y no tendría problemas para extraerlo de HKLM \ SYSTEM \ CurrentControlSet \ Enum \ DISPLAY pero no puedo encontrar la forma de hacer coincidir los datos con el monitor principal actual.

Encontré este progtwig de C en: http://www.tech-archive.net/Archive/Development/microsoft.public.development.device.drivers/2004-08/0294.html y un progtwig de Python similar: http: / /www.koders.com/python/fid7FCCE3C908F376DC62F06CAD9B11C6D7C1CFA78F.aspx

Desafortunadamente, estoy teniendo muchos problemas para convertir el progtwig C a python, ya que el código relevante no parece estar en los módulos win32all. Intentaría comstackrlo pero no tengo espacio en disco para un comstackdor grande y no he usado C durante años. Estoy un poco fuera de mi elemento con ctypes también.

Mi plan B será usar EnumDisplaySettings () para encontrar el mayor valor de resolución y configurarlo para eso. En las PC que he probado, da la resolución correcta, pero aún podría ser problemático.

Preferiría una solución en Python, pero tal vez alguien podría ayudarme a modificar el progtwig C para escupir la resolución y comstackrla. Gracias por adelantado.

Actualizar:

He encontrado una solución potencial. Ahora estoy leyendo WMI para encontrar un monitor que esté disponible (no fuera de línea), tomando su ID de dispositivo PNP y leyendo EDID del registro en la subclave con el valor de ID. Luego analizo los datos para los bytes 38 y 39 y calculo. No muy limpio, pero estoy obteniendo resultados. Si esta es una forma razonable de hacerlo, cerraré esta pregunta, gracias.

Decidió dejar de hablar directamente con el monitor y, en su lugar, analizar la información EDID almacenada en caché en el registro. Este código no es perfecto, pero funciona:

import win32api as api, win32con as con, pywintypes import win32com.client _objWMIService = win32com.client.Dispatch('WbemScripting.SWbemLocator') _objSWbemServices = _objWMIService.ConnectServer('.', 'root\\cimv2') wmiquery = _objSWbemServices.ExecQuery # get_regval(regkey) is simple registry reading function. def get_monitor_res(): dtd = 54 # start byte of detailed timing desc. try: # get PNP id to find EDID in registry for monitor in wmiquery('Select * from Win32_DesktopMonitor'): # http://msdn.microsoft.com/en-us/library/aa394122%28VS.85%29.aspx if monitor.Availability in (3, 7, 13, 14, 15, 16): # connected curres = (monitor.ScreenWidth, monitor.ScreenHeight) print 'DEBUG: Current monitor resolution from WMI: %s' % (curres,) regkey = ('HKLM\\SYSTEM\\CurrentControlSet\\Enum\\' + monitor.PNPDeviceID + '\\Device Parameters\\EDID') edid = get_regval(regkey) if edid: print 'DEBUG: EDID Version: %s.%s' % (edid[18], edid[19]) # upper nibble of byte x 2^8 combined with full byte hres = ((edid[dtd+4] >> 4) << 8) | edid[dtd+2] vres = ((edid[dtd+7] >> 4) << 8) | edid[dtd+5] print 'DEBUG: EDID DTD0: ' + str((hres, vres)) res = (hres, vres) break # give up on first success else: raise RuntimeError, 'EDID not found in registry' except (RuntimeError, Exception) as err: print 'ERROR: %s.' % err return res