Windowsでは「VESA EDID」を使ってモニターを自動設定する
Windows PCにモニターを接続すると、製品名もしくはそれっぽい名称が表示されるとともに、スペック(物理画面サイズや解像度、垂直同期周波数)を理解してデフォルト値などが自動で決定される。
MS-DOSの時代はモニターは自分で設定しないと、画面が乱れてしまっていた。現在ではモニターが持つ機能を使って、Windowsが取得した情報を利用し、制御している。今回はPC用モニターが持つ、情報提供の仕組みを解説する。
PC用モニターの標準化は、VESA(Video Electronics Standards Association、https://vesa.org/)という業界標準化団体が担っている。ここが、PC用モニターに対して以下の2つの仕様を定めていて、Windowsはこれを使って情報を得ている。
DDC (Display Data Channel)
E-DDC (Enhanced - Display Data Channel)
当初は、RGBコネクターの空きピンを使って情報を取得していたが、現在ではHDMIやDisplayPortなどのコネクター経由でE-DDC/DDCが利用できるようになっている。
E-DDC/DDC経由で得られる情報の形式などに関しては、以下の仕様が定義している。
EDID Extended Display Identification Data
E-EDID Enhanced - Extended Display Identification Data
DisplayID
以後、上記3つの仕様をまとめてEDIDと表記する。これらの仕様に関しては、前記VESAのFree Standardsのページ(https://vesa.org/vesa-standards/)から、ダウンロードできる(無料、要登録)。
実際のEDID情報を読み取る方法
Windowsでは起動時に接続されているモニターを見つけ、E-DDC/DDC経由でEDID情報を得て、レジストリに記憶させる。ユーザーがEDIDを利用するときには、このレジストリ情報を使う。
実際にモニターに接続しているのはGPUであり、E-DDC/DDCを使うのはGPUドライバーである。ユーザーがドライバーの副次的な機能(このようなE-DDC経由での読み出しなど)を使う手順は公開されておらず、Windows側にも相当するAPIは用意されていない。このため、レジストリに記録されているEDID値を使うしか現実的には方法がない。
EDIDはモニターごとの「Device Parameters」レジストリキーに「EDID」という名前で記録されている。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY\モニタ名\デバイス名\Device Parameters
モニタ名とは、EDIDから得られる情報から作られるモニターのモデル/機種を特定する文字列である。ただし、同一の機種は同一のモニタ名を持つ。デバイス名は、デバイスが接続されたときに与えられるデバイスのIDである。実は、モニタ名とデバイス名を“\”でつなげた文字列は、以下のCIMコマンドで得られる。
Get-CimInstance Win32_PnPSignedDriver -filter "DeviceID like 'DISPLAY%'" | select FriendlyName,DeviceID
CIMコマンドでPnPデバイスリストからディスプレイ(DISPLAY%)を探して表示するとDeviceIDは、レジストリキーの「HKLM:\SYSTEM\CurrentControlSet\Enum\」以下の部分に相当する。それぞれのDevice ParametersにEDIDがバイナリ値として記録されている
なお、このコマンドの出力順が、コントロールパネルや設定のディスプレーに付けられる番号と同じである。
EDIDを入手するには、以下のコマンドを使う。これは、前述のレジストリキーの「DISPLAY」以下から「Device Parameters」を再帰的に探して、そこに定義されている「EDID」という名前のデータなどを$xという変数に記録するものだ。
$x=Get-ChildItem -Path 'HKLM:\SYSTEM\CurrentControlSet\Enum\DISPLAY\' -Recurse -Include 'Device Parameters' -ErrorAction SilentlyContinue | %{$t=$_.GetValue('EDID');if($t -ne $null) { [pscustomobject] @{ VPCode=($_.Name -split '\\')[5];InstanceID=($_.Name -split '\\')[6] ;EDID=$t }} }
1回上記のコマンドを実行すれば、各モニターのEDID情報は、
$x[0].EDID
でアクセスできる。EDID内の情報の配置は、Wikipediaの英語版ページ(https://en.wikipedia.org/wiki/Extended_Display_Identification_Data#EDID_1.4_data_format)に記述がある。
ここにある17バイト目の値「Year of manufacture」を使って、すべてのモニターの製造年を得るには以下のコマンドが使える。
コマンドを使ってレジストリから読み出したEDID値をPowerShellの変数に記憶させる。以後は、モニタ番号とEDIDのバイト位置から情報を取り出せる。たとえばバイト位置17には製造年が、21と22には、横と縦の長さがセンチメートル単位で入っている。ここから日本式の「型」モニタサイズを算出できる
$x[0..99] | % { $_.EDID[17]+1990 }
また、画面サイズは21、22バイト目にある。ただし単位はcmである。いわゆるディスプレーサイズは、縦横をインチで測定したときの対角線のサイズを使うため、それぞれを2.54cm/inchで変換して計算する。
$x[0..99] | % {[Math]::Round( [Math]::Sqrt([Math]::Pow($_.EDID[21],2)+[Math]::Pow($_.EDID[22],2))/2.54 ,1) }
PowerShellの欠点として、べき乗数学関数が演算子や組み込み関数になっておらず、記述が面倒になる点がある。上記のコマンドも単にEDIDの21バイト目と22バイト目でピタゴラスの定理を使い斜辺の長さを求めるだけのものだ。それだけにしては記述がちょっと大げさすぎる。
EDIDには、製造年やメーカーコード、物理サイズ、スキャン周波数などの情報が含まれる。モニターに関する静的なパラメーターは、多くの場合EDID経由で入手が可能だ。
本記事はアフィリエイトプログラムによる収益を得ている場合があります

この連載の記事
-
第531回
PC
Windowsのコンソール上でUnix/Linuxの標準的なコマンドを動かす「Windows CoreUtils」 -
第530回
PC
Windows 11でタスクバーの位置の移動機能が復活するのは結局どうなった? プレビュー版の現状を見る -
第529回
PC
Windowsの標準スクリプト言語であるPowerShellの現状をあらためて紹介する -
第528回
PC
Windows 11の標準機能でメモリに問題がないかを診断する -
第527回
PC
Windowsがクラッシュする原因を究明する方法 AIを活用すると結構早い -
第526回
PC
今年6月にPCが起動しなくなる心配はないが、セキュアブートが機能しないとWindowsのセキュリティ機能は一部使えなくなる -
第525回
PC
6月以降「PCが起動不可能に?」と間違った騒がれ方をしている原因の「セキュアブート」とは? -
第524回
PC
Windows Insider Programが変化 チャンネルが3つになって整理される -
第523回
PC
AI傾倒に一息入れて、既存のWindowsの改良を宣言するMicrosoft タスクバーを画面の上下左右に移動可能に!? -
第522回
PC
Windowsでも完全キーボード操作派は注目! PowerToysのコマンドパレット - この連載の一覧へ











