• モニター No.6

PCに接続できる外付けのモニターディスプレイは、Windowsから情報を取得できるようになっている。それには、VESA(Video Electronics Standards Association。ベサ)で作成された以下の仕様が関係する。

  • DDC Display Data Channel
  • E-DDC Enhanced - Display Data Channel
  • EDID Extended Display Identification Data
  • E-EDID Enhanced - Extended Display Identification Data
  • DisplayID

DDCは、VGAコネクタの空きピンを使って、モニターの仕様をPC側に伝えたものが始まり。簡単にいうと、DDC/E-DDC(以下DDCと略記する)は、ディスプレイの内蔵ROMをI2Cで伝送する物理的な仕様である。その上で、伝送される情報の構造(EDID structure)を定めるのがEDID/E-EDIDである。なお、EDID/E-EDIDは、後継の仕様としてDisplayIDが策定されている。

DDC/E-DDCは、PC側から電力を供給することで、モニターがオフの状態でも情報を伝えることができる。現在では、VGAコネクタだけでなく、DisplayPortやHDMI、DVIなどのコネクタにも組み込まれている。

EDID/E-EDID/DisplayID(以下EDIDと略記する)は、このときに読み出される情報の構造を定義する。ここには、モニターの物理サイズや製品ID、製造年などの基本的なメタ情報や、解像度、タイミング、信号仕様などが含まれている。オペレーティングシステムは、ディスプレイの使用に先立ち、EDID/E-EDID/DisplayIDを得て、適切な方法でディスプレイを制御する。

一般に、モニターは、ディスプレイアダプタ(GPU)に接続されるため、モニターの制御は、ディスプレイアダプタのデバイスドライバーを介して行う。デバイスドライバーから情報を得るには、ドライバが独自に定義するIOCTLなどを使う必要があるため、DDCを直接制御するのは難しい。しかし、Windowsは、接続時にEDIDを読み出して、レジストリに保存している。このため、ユーザーアプリケーションは、レジストリを読み出すことで、ディスプレイのEDIDを得ることができる。

モニターの情報を表す仕様が複数あるのは、最初のDDC/EDIDが1994年に策定されてから、ディスプレイ技術が急速に発達し、現在でもまだ発達中だからだ。1994年当時、4KディスプレイもHDRも、HDMIもなかった。また、ヘッドマウント・ディスプレイも最近登場したものだ。モニターは、解像度や水平スキャン周波数などのタイミングデータをコンピュータ側に渡す必要があるため、新しいモニターが登場するときには、仕様が確定している必要がある。逆にいうとDDC/EDIDが登場するまで、ユーザーはモニターの正しい解像度やスキャン周波数を設定する必要があった。

ここでは、簡単にアクセスできるモニターのEDIDを取得してみよう。まず、現在接続されているモニターの一覧は、以下のコマンドで得られる(写真01)。


gcim Win32_PnPSignedDriver -filter "DeviceID like 'DISPLAY%'" | select FriendlyName,DeviceID
  • 写真01: 現在接続しているモニターの情報は、コントロールパネルのデバイスマネージャーからも得られるが、PowerShellコマンドからも得られる。レジストリ内に各モニターのEDIDが記録されていて、その途中部分が、DeviceIDと一致するため、対応は容易と思われる

また、コントロールパネルのデバイスマネージャーからモニターを開いてもよい。前記のコマンドのDeviceIDは、モニターのプロパティにある「デバイスインスタンスパス」に相当する。

Windows 11がモニターから読み出したEDIDは、「HKLM:\SYSTEM\CurrentControlSet\Enum\DISPLAY\」の下にある。DISPLAYからのレジストリパスが前記のDeviceID/デバイスインスタンスパスに相当する。全てのEDID値を得るには、PowerShellで以下のコマンドを実行する。


$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 }} }

これで変数$xにEDIDが取得できた(写真02)。$xには複数のモニターの情報が配列として格納されているので、$x[0]とすると先頭のモニターの、$x[1]で2番目のモニターの情報を取り出せる。EDIDを16進数ダンプするには、


$x[0].EDID | Format-Hex

などとする。

  • 写真02: レジストリから取得したEDIDデータを変数に記録しておけば、EDID内から情報を得るのがラクになる。たとえば、EDIDの21番目、22番目のバイトには、物理画面の横、縦の長さがセンチメートル単位で記録されている。簡単な計算で、これをインチ表示に直すことも可能

EDID structureに関しては、VESAのドキュメント「VESA ENHANCED EXTENDED DISPLAY IDENTIFICATION DATA STANDARD Release A, Revision 2」に記載がある。ダウンロードは、VESAのFREE STANDARDSのページにあるリンクから行う(要登録)。なお、EDIDは、仕様ドキュメントのバージョン番号とは別に、EDID Structureのバージョンを使って表現されることが多い。前記のドキュメントで定義されるのは、EDID Structure 1.4(EDID Structure Version 1, Revision 4)である。なお、英語のWikipediaのページにExtended Display Identification Dataの解説があり、これを見た方が手っ取り早いかもしれない。

ここでは、簡単にディスプレイの物理サイズを取得してみる。これは、EDIDの21番目(横幅。センチメートル単位)、22番目(縦。センチメートル単位)にある。前記の$x[0]を使うなら、


$x[0].EDID[21]
$x[0].EDID[22]

でアクセスできる。ただし、これはセンチメートル単位で表現された縦横の長さなので、一般的な「インチ」(日本国内ではインチを単位として使用できないため型と呼ぶ)に変換する。PowerShellは初等関数の記述が面倒なので、関数を定義しておく。内容は単純で、ピタゴラスの定理を使って対角線の長さを縦横の長さから計算して、インチ(1 inch = 2.54センチ)に変換している。


Function monsize($x) {return ([Math]::Round([Math]::Sqrt([Math]::Pow($x.EDID[21],2)+[Math]::Pow($x.EDID[22],2))/2.56 ,1))}

これを使って、前記の$xと組合せ「monsize $x[0]」とすれば、先頭のモニターのインチ数が得られる。

今回のタイトルネタは、1967年のイギリスのテレビドラマ「The Prisoner」の邦題「プリズナーNo.6」から。諜報組織を辞職した主人公は所在不明の「村」に捉えられてしまう。ここには多数の「囚人」がいて、みな番号で呼ばれる。主人公は、No.6と呼ばれ、村のリーダーNo.2から「情報」を要求されるが、主人公はこれを拒否、村からの脱出を試みる。テレビドラマのノベライズがトーマス・M・ディッシュの「プリズナー」(ハヤカワ文庫SF)とされているが、ドラマとは異なる部分も多く、ドラマに触発された小説といえる。

テレビ番組「名車再生!クラシックカー・ディーラーズ」(英番組名はWheeler Dealers)で、Caterham Seven(旧Lotus Seven)を扱ったとき、「村」のロケ地であるホテル ポートメイリオンを試走した。Lotus sevenは、The Prisonerのオープニングで主人公が乗っていた車。