2010-12-01 33 views
6

我需要找到「最佳」或原生的Windows下的連接LCD顯示器的分辨率(我會再設置程序,並知道該怎麼辦。)讓我再說一遍,我並不需要當前的Windows分辨率,也不需要擔心CRT /投影儀。如何在Windows中查詢主監視器的NATIVE硬件分辨率?

我已經看到了這個程序的工作,所以我知道這是可能的,儘管反對者: http://www.entechtaiwan.com/util/moninfo.shtm

這將是最好直接交談的監測和查詢EDID信息。不過,我已經看到了它在註冊表中緩存,不會出現從HKLM \ SYSTEM挖掘出來\ CURRENTCONTROLSET \枚舉\顯示器的問題,但無法弄清楚如何將數據與當前的主顯示器相匹配。

我發現在這個C程序: http://www.tech-archive.net/Archive/Development/microsoft.public.development.device.drivers/2004-08/0294.html 和類似的Python程序: http://www.koders.com/python/fid7FCCE3C908F376DC62F06CAD9B11C6D7C1CFA78F.aspx

不幸的是,我遇到了很多麻煩的C程序轉換爲蟒,因爲相關的代碼沒有按」似乎在win32all模塊中。我試圖編譯它,但沒有一個大的編譯器的磁盤空間,並且多年沒有使用C語言。我用ctypes也有點不合格。

我的B計劃將使用EnumDisplaySettings()找到解決的最大的值,並將其設置爲。在PC上,我試過它給出了正確的資源,但它仍然可能存在問題。

我更喜歡Python中的解決方案,但也許有人可以幫助我修改C程序來吐出解析並編譯它。提前致謝。

更新:

我發現了一個潛在的解決方案。我現在讀WMI找到一個顯示器可用(不離線),抓住它的PNP設備ID,並在與id值的子項中的註冊表讀取EDID。然後我解析字節38和39的數據並進行計算。不是很乾淨,但正在得到結果。如果這是一個合理的做法,我會關閉這個問題,謝謝。

+0

還有一些非常小的編譯器,比如Pelles C和DevCpp。 – 2010-12-01 08:07:55

+0

很高興知道,謝謝。 – 2010-12-01 10:42:26

回答

2

決定放棄直接對話的監測和分析,而不是在註冊表中緩存的EDID信息。這個代碼並不完美,但它的工作原理如下:

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