2010-12-01 10 views
6

Windows上で接続されたLCDモニタの「最高の」解像度またはネイティブ解像度を見つける必要があります(プログラムで設定し、それを行う方法を知っています)。私は現在のWindowsの解像度は必要ないし、 CRT /プロジェクターを心配する。WindowsのプライマリモニタのNATIVEハードウェア解像度を照会するにはどうすればよいですか?

私はそれがこのプログラムで作業を見てきましたので、私はそれが投じたにもかかわらず可能です知っている: http://www.entechtaiwan.com/util/moninfo.shtm

それはモニターに直接話をしてEDID情報を照会するのがベストでしょう。しかし、私はそれがレジストリにキャッシュされ、HKLM \ SYSTEM \ CurrentControlSet \ Enum \ DISPLAYから問題を掘り起こすことはできませんでしたが、現在のプライマリモニタとどのようにデータをマッチさせるのか分かりません。関連するコードは「doesnのように、 http://www.koders.com/python/fid7FCCE3C908F376DC62F06CAD9B11C6D7C1CFA78F.aspx

残念ながら、私のpythonにCプログラムを変換する多くの問題を抱えている: http://www.tech-archive.net/Archive/Development/microsoft.public.development.device.drivers/2004-08/0294.html と同様のPythonプログラム:

は、私は、このCのプログラムを見つけましたwin32allモジュールにあるようです。私はそれをコンパイルしようとしますが、大きなコンパイラのためのディスクスペースを持たず、何年もCを使用していません。私もctypesで私の要素のビットです。

私の計画Bは、EnumDisplaySettings()を使用して解像度の最大値を見つけてそれに設定します。 PC上で私はそれを試しましたが、正しい解決策を与えますが、それでも問題がある可能性があります。

私はPythonの解決策を望んでいますが、おそらく誰かがCプログラムを修正して解像度を吐き出してコンパイルする手助けをすることができます。前もって感謝します。

更新:

私は潜在的な解決策を見つけました。私は現在、WMIを読んで、利用可能な(オフラインではない)モニタを見つけ、そのPNPデバイスIDを取得し、ID値を持つサブキーのレジストリからEDIDを読み取ります。次に、バイト38と39のデータを解析して計算します。あまり清潔ではありませんが、結果を得ています。これが合理的なやり方であれば、私はこの質問を終わらせます、ありがとう。

+0

Pelles CやDevCppのようにかなりコンパクトなコンパイラもあります。 –

+0

おかげで、ありがとう。 –

+0

質問を終了しないで、新しい回答であなた自身に答えてください。明日あなたはあなたがしたいならあなた自身の答えを受け入れることさえできます。これは面白かったです。 –

答えて

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 
+0

「wmiquery」はどのライブラリですか?私はそれを見つけるように見えない。 – soren121

+0

申し訳ありませんが、私のコードから抽出しようとしました。それはapiの名前がとても恐ろしいので私が作成した名前です。今追加する。 –

関連する問題