2

ユーザーが設定したもの(現在の解像度)ではなく、モニターのネイティブ解像度を知る必要があるVBアプリケーションを開発しています。そのため、モニターから直接 EDID (拡張ディスプレイ識別データ) を読み取る必要があります。

いくつかのプログラムでモニターの解像度を見つけようとしました...しかし、返されるのは現在の解像度だけです。モニターの EDID から直接情報を読み取るためのヘルプはかなりあります。

前もって感謝します

4

3 に答える 3

6

多くの調査の後、私は問題を解決することができました..貴重な情報Yahiaに感謝します。

まず、EDID データを見つける必要があります。実際、物理的なディスプレイ情報は、拡張ディスプレイ識別データ (EDID) を介して OS で利用できます。EDID ブロックのコピーは、Windows レジストリに保持されます。しかし、問題は正しい EDID を取得することでした。レジストリには、いつでもシステムに接続されているすべてのモニターに関する情報が保存されているためです。そのため、最初に WMI クラス「Win32_DesktopMonitor」を使用し、単純な SQL クエリを使用して PNP デバイス ID を取得し、利用可能な (オフラインではない) モニターを見つけます。次に、レジストリを掘り下げてデータを見つけることができます。

`'wmquery のモニター用('Select * from Win32_DesktopMonitor'):

regkey = ('HKLM\SYSTEM\CurrentControlSet\Enum\' + monitor.PNPDeviceID + '\Device Parameters\EDID') edid = get_regval(regkey)'`

次に、データを解析する必要があります。ディスプレイの基本 EDID 情報は、関連する製造元および操作関連のデータを含む 128 バイトのデータ構造内で伝達されます。この情報のほとんどは、私たちにとって興味深いものではありません。

NATIVE 解像度を知るには、バイト = 54 から始まる DTD (詳細なタイミング記述子) を調べる必要があります。

以下は、EDID から最大解像度を見つけるためのロジックです。

`dtd = 54 # 詳細タイミング desc の開始バイト。

horizo​​ntalRes = ((edid[dtd+4] >> 4) << 8) | edid[dtd+2] 垂直解像度 = ((edid[dtd+7] >> 4) << 8) | edid[dtd+5] res=(horizo​​ntalRes,verticalRes)`

得られた値は 16 進値であり、10 進値に変換してネイティブ解像度をピクセル単位で見つけることができます。

ありがとう、それがサチンに役立つことを願っています

于 2012-04-24T14:19:55.493 に答える
1

EDIDブロックを読み取るための一部のソースコード(C / C ++ですが)については、このリンクのポイント5を参照してください。WindowsセットアップAPIを介してこの情報を取得する唯一の公式な手段。

EDID形式の説明については、たとえばここを参照してください。

于 2012-04-09T12:43:45.413 に答える