AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Monitornamen wie in Systemsteuerung auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

Monitornamen wie in Systemsteuerung auslesen

Ein Thema von Zimond · begonnen am 7. Apr 2015 · letzter Beitrag vom 27. Apr 2015
Antwort Antwort
hathor
(Gast)

n/a Beiträge
 
#1

AW: Monitornamen wie in Systemsteuerung auslesen

  Alt 8. Apr 2015, 00:13
Aufruf:
Systemsteuerung\Alle Systemsteuerungselemente\Anzeige\Bildschirmauflösu ng

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var FN: String;
begin
FN:= 'Shell32.dll,Control_RunDLL desk.cpl';
ShellExecute(0,nil,PChar('Rundll32.exe'),PChar(FN),'',SW_SHOWNORMAL);
end;
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#2

AW: Monitornamen wie in Systemsteuerung auslesen

  Alt 8. Apr 2015, 09:57
mit der Funktion EnumDisplayDevices() bekommst Du alle Werte, welche Du benötigst.
Angehängte Grafiken
Dateityp: jpg MonitorInfo.jpg (239,8 KB, 61x aufgerufen)
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Benutzerbild von MessOldie
MessOldie

Registriert seit: 1. Apr 2009
Ort: Reinsdorf OT Friedrichsgrün
12 Beiträge
 
Delphi 6 Personal
 
#3

AW: Monitornamen wie in Systemsteuerung auslesen

  Alt 14. Apr 2015, 09:51
EnumDisplayDevices führt bei mir nur bis zu den Standardnamen, wie "Pnp-Monitor" usw.
Ich muss letzten Endes doch über die EDID-Auswertung gehen, um an den "Klarnamen" des Monitors zu kommen.
Für solche Aufgaben habe ich mir eine Unit gemacht. Wenn die wer will, kann er sie gerne kriegen...
(WinXP, Win7, Delphi5/6)
Gottfried Pilz
Man kann immer noch dazulernen

Geändert von MessOldie (14. Apr 2015 um 10:08 Uhr) Grund: Wiederholung
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#4

AW: Monitornamen wie in Systemsteuerung auslesen

  Alt 14. Apr 2015, 11:51
EnumDisplayDevices führt bei mir nur bis zu den Standardnamen, wie "Pnp-Monitor" usw.
Mit welchen Parametern rufst Du die Funktion auf?
Zeig' einmal ein Beispielaufruf.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Benutzerbild von MessOldie
MessOldie

Registriert seit: 1. Apr 2009
Ort: Reinsdorf OT Friedrichsgrün
12 Beiträge
 
Delphi 6 Personal
 
#5

AW: Monitornamen wie in Systemsteuerung auslesen

  Alt 15. Apr 2015, 10:09
Ausschnitt aus meiner Unit:
Delphi-Quellcode:
Unit MonitorInfo;

interface

uses Windows; //CCHDEVICENAME ist in Windows.pas definiert

type
  HMONITOR = type Integer;
  {$EXTERNALSYM HMONITOR}

function GetMonitorEDID(MonitorHandle: HMONITOR): String;
//die folgenden Funktionen nutzen dann die EDID)
function ExtractMonitorName(var edid: String): String;
function ExtractMonitorSerNumb(var edid: String): String;
function ExtractMonitorAddedText(var edid: String): String;
//function ExtractMonitorEisaId(var edid: String): String;
//function ExtractMonitorNumSerNumb(var edid: String): String;
//function ExtractMonitorManufacturingWeek(var edid: String): String;
//function ExtractNativeResolution(var edid: String): String;
//function ExtractMonitorRangeLimits(var edid: String): String;
//function ExtractMaxWidthHeightCm(var edid: String): String;
//function MonitorCheckSumCheck(var edid: String): Boolean;
///...

implementation

uses SysUtils, Classes, Registry, Dialogs;

type
  TMonitorInfoEx = packed record
    Size: DWORD;
    rcMonitor: TRect;
    rcWork: TRect;
    dwFlags: DWORD;
    szDevice: array[0..CCHDEVICENAME-1] of AnsiChar;
  end;

function GetMonitorInfo(hMonitor: HMONITOR;
                        var MonitorInfo: TMonitorInfoEx): Boolean; stdcall;
  external 'User32.dllname 'GetMonitorInfoA';

type
  TDisplayDevice = packed record
    Size: DWORD;
    DeviceName: array[0 .. CCHDEVICENAME-1] of AnsiChar;
    DeviceString: array[0 .. 127] of AnsiChar;
    StateFlags: DWORD;
    DeviceID: array[0..127] of AnsiChar;
    DeviceKey: array[0..127] of AnsiChar;
  end;

function EnumDisplayDevices(ADeviceName: PChar; ADeviceIndex: DWORD;
                            Var ADisplayDevice: TDisplayDevice;
                            AFlags: DWORD): Boolean; stdcall;
   external 'User32.dllName 'EnumDisplayDevicesA';
                        
function GetMonitorName(MonitorHandle: HMONITOR): String;
  var
    MoniInfo: TMonitorInfoEx;
begin
  Result := '';
  MoniInfo.Size := SizeOf(MoniInfo); //Wichtig!
  if not GetMonitorInfo(MonitorHandle, MoniInfo) then
    raise Exception.Create('GetMonitorInfo?') //***************
  else
    Result := MoniInfo.szDevice
end;

function GetMonitorEDID(MonitorHandle: HMONITOR): String;
  var
    DisplayInfo: TDisplayDevice;
    s: String;
    i, n: Integer;
    reg: TRegistry;
    keyList: TStringList;
begin
  s := GetMonitorName(MonitorHandle);
  if Length(s) > 0 then
  try
    DisplayInfo.Size := SizeOf(DisplayInfo);
    if not EnumDisplayDevices(PChar(s), 0, DisplayInfo, 0) then
      raise Exception.Create('EnumDisplayDevices?'); // ==> finally
    s := DisplayInfo.DeviceID;
    n := Pos('MONITOR\', s);
    if n <> 1 then
      raise Exception.Create('DeviceID?'); // ==> finally
    Delete(s, 1, Length('MONITOR\'));
    n := Pos('\{', s);
    if n = 0 then
      raise Exception.Create('DeviceID?'); // ==> finally
    Delete(s, n, Length(s));
    s := 'SYSTEM\CurrentControlSet\Enum\DISPLAY\' + s;
    reg := TRegistry.Create;
    reg.RootKey := HKEY_LOCAL_MACHINE;
    keyList := TStringList.Create;
    keyList.Clear;
    try
      if not reg.OpenKeyReadOnly(s) then
        raise Exception.Create('DeviceID?');
      reg.GetKeyNames(keylist);
      reg.CloseKey;
      n := 0;
      for i := 0 to KeyList.Count-1 do
      begin
        if reg.OpenKeyReadOnly(s + '\' + keyList[i] + '\Control') then
        begin
          s := s + '\' + keyList[i] + '\Device Parameters';
          reg.CloseKey;
          if reg.OpenKeyReadOnly(s) then
          begin
            n := reg.GetDataSize('EDID');
            Break;
          end;
        end;
      end; //for i
      if n = 0 then
        raise Exception.Create('EDID?'); // ==> finally
      SetLength(Result, n);
      reg.ReadBinaryData( 'EDID', Result[1], n);
    finally
      reg.CloseKey;
      keyList.Free;
      reg.Free;
    end;
  except
    SetLength(Result, 0);
    raise;
  end;
end;

function ExtractMonitorNameNumbText(Tag: Byte; var edid: String): String;
  var i, k: Integer;
begin
  Result := '';
  if Length(edid) > 60 then
    for i := 55 to Length(edid) do
    begin
       if (edid[i] = Chr(0)) and (edid[i+1] = Chr(0)) and (edid[i+2] = Chr(0)) and
          (edid[i+4] = Chr(0)) and (edid[i+3] = Chr(Tag)) then
      begin
        for k := i+5 to Length(edid) do
          if edid[k] = Chr($0A) then
            Break
          else
            Result := Result + edid[k];
      end;
    end;
end;

function ExtractMonitorName(var edid: String): String;
begin
  Result := ExtractMonitorNameNumbText($FC, edid);
end;

function ExtractMonitorSerNumb(var edid: String): String;
begin
  Result := ExtractMonitorNameNumbText($FF, edid);
end;

function ExtractMonitorAddedText(var edid: String): String;
begin
  Result := ExtractMonitorNameNumbText($FE, edid);
end;

//...
end.
Nutzung im Programm (z. B.):
Delphi-Quellcode:
//...
var
  Memo1: TMemo;
  edid, s: String;
for i := 0 to Screen.MonitorCount-1 do
begin
  edid := GetMonitorEDID(Screen.Monitors[i].Handle);
  Memo.Lines.Add(ExtractMonitorName(edid));
end;
- Das meiste habe ich mir hier oder an anderer Internet-Stelle "aufgelesen".
- Wer den Programmierstil für unmodern hält, hat sicher recht. Aber ich bin inzwischen so alt, dass mir Überschaubarkeit wichtiger ist als Eleganz.
- Wer Fehler findet, sollte sie nicht behalten, sondern mir um die Ohren hauen
Gottfried Pilz
Man kann immer noch dazulernen

Geändert von MessOldie (15. Apr 2015 um 11:23 Uhr) Grund: Tippfehler selbst gefunden
  Mit Zitat antworten Zitat
Benutzerbild von MessOldie
MessOldie

Registriert seit: 1. Apr 2009
Ort: Reinsdorf OT Friedrichsgrün
12 Beiträge
 
Delphi 6 Personal
 
#6

AW: Monitornamen wie in Systemsteuerung auslesen

  Alt 15. Apr 2015, 11:40
Früher war nicht unbedingt besser, denn mit 640kb Hauptspeicher auszukommen war schon eine Herausforderung.
Noch früher musste ich mit 1kByte für Programm und Daten auskommen, also tu nicht so...
(Z80-Eigenbau in Assembler)
Gottfried Pilz
Man kann immer noch dazulernen
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#7

AW: Monitornamen wie in Systemsteuerung auslesen

  Alt 15. Apr 2015, 16:10
Getestet unter Delphi2007 mit zwei Monitoren:

Fehler in der Funktion "GetMonitorEDID"

Delphi-Quellcode:
    n := Pos('MONITOR\', s);
    if n <> 1 then
      raise Exception.Create('DeviceID?'); // ==> finally
Es wird immer die Exception ausgelöst, da
Code:
Pos('MONITOR\', s);
0 zurück gibt.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Benutzerbild von MessOldie
MessOldie

Registriert seit: 1. Apr 2009
Ort: Reinsdorf OT Friedrichsgrün
12 Beiträge
 
Delphi 6 Personal
 
#8

AW: Monitornamen wie in Systemsteuerung auslesen

  Alt 27. Apr 2015, 09:38
Nachdem ich mich weiter "umgeschaut" habe, vermute ich, dass EnumDisplayDevices (im "zweiten" Aufruf) die "richtigen" Monitornamen liefert, wenn die zugehörigen Monitortreiber installiert wurden. Benutzt man die windowsinternen Treiber, so liefert EnumDisplayDevices auch nur "PnP-Monitor (Standard)" zurück und man kann die "echten" Monitornamen nur aus der Registry auslesen:
\Registry\Machine\System\CurrentControlSet\Enum\Di splay\xxx\yyy\Device Parameters\EDID
(xxx und yyy sind im zweiten Aufruf von EnumDisplayDevices in DeviceID enthalten.)


Getestet unter Delphi2007 mit zwei Monitoren:

Fehler in der Funktion "GetMonitorEDID"

Delphi-Quellcode:
    n := Pos('MONITOR\', s);
    if n <> 1 then
      raise Exception.Create('DeviceID?'); // ==> finally
Es wird immer die Exception ausgelöst, da
Code:
Pos('MONITOR\', s);
0 zurück gibt.
Die Zeile muss geändert werden in
n := Pos('MONITOR\', Uppercase(s)); Bitte entschuldigt...
Gottfried Pilz
Man kann immer noch dazulernen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz