EDIDブロックから派生した情報(モニターモデル、ID、S / Nなど)を対応するモニターのダイアログに表示するアプリケーションを開発しています。
このコードは、ディスプレイのEDID情報を見つけるために機能します。HKLM \ SYSTEM \ CurrentControlSet \ Enum \ DISPLAY \ [Monitor] \ [PnPID] \ Device Parameters\EDIDの下にあるDISPLAYキーを列挙してEDID情報を抽出します。
更新:上記のコードは、レジストリのPnP使用の「副作用」に依存しています。現在、SetupAPIを使用してモニターを列挙しています。これは、接続/削除されているモニターを正しく処理します(上記のリンクのコードとは異なります)。
Windows.Forms.Screen.AllScreens [](\\。\ DISPLAY1、\\。\ DISPLAY2など)の各画面を、上記のレジストリ検査から返されたエントリと関連付けようとしています。
注:以下のコードブロックでは、DisplayDetails.GetMonitorDetails()が、SetupAPIを使用してより堅牢なレジストリ列挙コードに置き換えられましたが、返されるデータは同じです。
例えば
private void Form1_Load(object sender, EventArgs e)
{
Console.WriteLine("Polling displays on {0}:", System.Environment.MachineName);
int i = 0;
foreach ( DisplayDetails dd in DisplayDetails.GetMonitorDetails())
{
Console.WriteLine( "Info: Model: {0}, MonitorID: {1}, PnPID: {2}, Serial#:{3}", dd.Model, dd.MonitorID, dd.PnPID, dd.SerialNumber );
Console.WriteLine( "Does this correlate to Screen: {0}?", Screen.AllScreens[i++].DeviceName );
}
}
出力:
情報:モデル:DELL P2411H、MonitorID:DELA06E、PnPID:5&2e2fefea&0&UID1078018、Serial#:F8NDP0C ... PU
これは画面:\\。\ DISPLAY1と相関関係がありますか?
情報:モデル:DELL P2411H、MonitorID:DELA06E、PnPID:5&2e2fefea&0&UID1078019、Serial#:F8NDP0C ... AU
これは画面:\\。\ DISPLAY2と相関関係がありますか?
回答:いいえ
テストでは、これらが確実に相関していないことがわかりました(最初に列挙されるディスプレイが\\。\ DISPLAY2であるシステムがあります)。
私の質問: 特定のForms.ScreenのEDID情報を確実に取得する方法はありますか? EDIDブロックを取得できますが、これをUIトップレベルフォームに関連付けるパスが見つかりません。私のユースケースでは、2つ(またはそれ以上)のモニターが同じモデルと解像度であり、S / Nが数桁異なるだけなので、ユーザーにプロンプトを表示することは望ましくありません。
Forms.Screen API、Win32 EnumDisplay、その他のレジストリGUID(PnPおよびドライバー関連)に続くパスを探しましたが、有望なパスは見つかりませんでした。
WMI Win32_DesktopMonitor API(Windows 7)も調査しましたが、Windows.Forms.Screen.AllScreens[]エントリとの関連付けに役立つ情報がこれ以上ないようです。
これを行う方法があるかどうかは疑わしいです。それはSetupAPIを介して行われますが、まだ見つけていません。