2012-04-09 1 views
2

Ich entwickle eine VB-Anwendung, in der ich die native Auflösung des Monitors kennen muss und nicht die vom Benutzer eingestellte (aktuelle Auflösung). Also muss ich die EDID (erweiterte Display-Identifikationsdaten) direkt vom Monitor lesen.Wie holen Sie die NATIVE-Auflösung des angeschlossenen Monitors von EDID-Datei über VB6.0?

Ich habe versucht, die Auflösung des Monitors durch einige Programme zu finden ... aber alles, was es zurückgibt, ist die aktuelle Auflösung. Jede Hilfe, um die Informationen direkt von EDID des Monitors zu lesen, ist von Vorteil.

Vielen Dank im Voraus

Antwort

1

Für einige Quellcode (obwohl C/C++), um den EDID-Block siehe Punkt 5 bei this link zu lesen. Das einzige offizielle Mittel, um diese Informationen über Windows Setup API abzurufen.

Für eine Beschreibung des EDID-Formats siehe zum Beispiel here.

+0

@ yahia..Thanku so mch :) –

+1

@SachinVerma Sie sind willkommen :-) – Yahia

6

Nach viel Forschung konnte ich mein Problem beheben .. Danke für die wertvollen Informationen Yahia.

Zuerst müssen wir die EDID-Daten finden. Die physikalischen Anzeigeinformationen sind tatsächlich für das Betriebssystem über EDID (Extended Display Identification Data) verfügbar. Eine Kopie des EDID-Blocks wird in der Windows-Registrierung gespeichert. Das Problem bestand jedoch darin, die korrekte EDID zu erhalten, da in der Registrierung Informationen über alle Monitore gespeichert sind, die zu irgendeinem Zeitpunkt mit dem System verbunden waren. Also, zuerst verwenden wir eine WMI-Klasse "Win32_DesktopMonitor", und durch eine einfache SQL-Abfrage greifen Sie die PNP-Geräte-ID, um einen verfügbaren Monitor zu finden (nicht offline). Wir können dann in die Registrierung graben, um die Daten zu finden.

` 'für Monitor in wmiquery (' Select * from Win32_DesktopMonitor '):

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

Zweitens ist es notwendig, die Daten zu analysieren. Die Basis-EDID-Information einer Anzeige wird innerhalb einer 128-Byte-Datenstruktur übermittelt, die relevante Hersteller- und Betriebsdaten enthält. Die meisten dieser Informationen sind für uns uninteressant.

die native Auflösung wissen wir in der DTD (Detaillierte Timing-Descriptor), die bei Byte beginnt = 54

Es folgt die Logik zum Auffinden der maximalen Auflösung von der EDID

starten müssen suchen ` dtd = 54 # Startbyte des detaillierten Timing-Desc.

horizontalRes = ((edid [dtd + 4] >> 4) < < 8) | edid [dtd + 2] verticalRes = ((edid [dtd + 7] >> 4) < < 8) | edid [dtd + 5] res = (horizontalRes, verticalRes) `

Die erhaltenen Werte sind Hex-Werte, die in Dezimal konvertiert werden können, um die NATIVE RESOLUTION in Pixel zu finden.

Dank Hoffe, es Sachin

+1

Hey, das hat mir geholfen, nachdem ich Wochen, vielleicht sogar Monate nach einer Antwort gesucht habe. Ich möchte auch wissen, wie man die genaue Bildwiederholfrequenz von EDID bekommt, und die Wikipedia-Seite erklärt das nicht wirklich gut. Hattest du das vielleicht schon? – NmdMystery

+0

@NmdMystery: Ich bin froh, dass es geholfen hat. Nein, ich habe die Aktualisierungsrate von EDID nicht untersucht. –

1

‚hilft ist die komplette Lösung für alles außer für die Auflösung tatsächlich einstellen. Dadurch werden die nativen Auflösungseinstellungen aus der EDID des aktiven Monitors ausgelesen.

Set WshShell = WScript.CreateObject ("WScript.Shell")

Const HKEY_LOCAL_MACHINE = & H80000002 Const DTD_INDEX = 54

strComputer = ""

Set objWMIService = GetObject ("winmgmts: \" & strComputer & "\ root \ cimv2") Set Oreg = GetObject ("winmgmts: {ImpersonationLevel = impersonate} \" & strComputer & „\ root \ default: StdRegProv ")

Set colItems = objWMIService.ExecQuery (" select * from Win32_DesktopMonitor“,, 48) For Each objItem in colItems‚Ruft aktiven Monitor EDID Registrierungspfad strKeyPath = "SYSTEM \ CurrentControlSet \ Enum \" & objItem .PNPDeviceID & "\ Geräteparameter"
Weiter

oReg.GetBinaryValue HKEY_LOCAL_MACHINE, strKeyPath "EDID", arrRawEDID

hor_resolution = arrRawEDID (DTD_INDEX + 2) + (arrRawEDID (DTD_INDEX + 4) und 240) * 16 = vert_resolution arrRawEDID (DTD_INDEX + 5) + (arrRawEDID (DTD_INDEX + 7) und 240) * 16

WshShell.Run "res.exe" & hor_resolution & "" & vert_resolution