Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Name vom Monitor abfragen (https://www.delphipraxis.net/67684-name-vom-monitor-abfragen.html)

BlueStarHH 18. Apr 2006 15:28


Name vom Monitor abfragen
 
Wie kann ich den Namen vom aktuell verwendeten Monitor(-Treiber) abfragen? Dieser Name wird angezeigt wenn man mit der rechten Maustaste auf den Desktop klickt, dort im Menü "Eigenschaften" auswählt und dann unter "Einstellungen > Erweitert > Monitor > Monitortyp" nachschaut. Ich habe schon herausgefunden, dass dieser Name in der Registry unter HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\D ISPLAY\XXXXX steht. Doch stehen dort auch andere Monitore, die mal mit dem PC verbunden waren oder die Standardmonitore. Wie kann ich da die aktuell verwendeten herausfinden? Muss das über die Registry gehen oder gibt es da API-Funktionen dafür? Windows XP würde mir reichen.

Loki77 18. Apr 2006 15:40

Re: Name vom Monitor abfragen
 
Bin da letztens über GetDisplay oder so gestolpert, hab grad leider nicht die möglichkeit es zu prüfen...
(IMAPI)

Muetze1 19. Apr 2006 11:38

Re: Name vom Monitor abfragen
 
EnumDisplayDevices(), DISPLAY_DEVICE.

BlueStarHH 19. Apr 2006 12:14

Re: Name vom Monitor abfragen
 
Zitat:

Zitat von Muetze1

Das ist es leider nicht. Das gibt mir die Namen der Grafikkarten-Treiber zurück. Ich möchte den Monitor(-Treiber)-Namen haben.

Muetze1 19. Apr 2006 15:00

Re: Name vom Monitor abfragen
 
Sorry, mein Fehler: GetMonitorInfo(), MONITORINFOEX

EDIT: so, nochmal und endgültig nachgeschaut, es wird doch vom vorherigen EnumDisplayDevices() zurück gegeben, da du anstatt NIL im ersten Parameter den richtigen Device String (spezifisch) angeben musst (den Adapternamen) und dann bekommste die Info zu dem dort angeschlossenen Monitor. Hier nun mein alter Code dazu:

Delphi-Quellcode:
Procedure TForm1.FillMonitorList;
Var
  Cntr       : Cardinal;
  Info       : TDisplayDevice;
  AdapterName : PChar;
  OldPos     : Integer;
Const
  DISPLAY_DEVICE_ATTACHED_TO_DESKTOP = $00000001;
  DISPLAY_DEVICE_MULTI_DRIVER       = $00000002;
  DISPLAY_DEVICE_PRIMARY_DEVICE     = $00000004;
  DISPLAY_DEVICE_MIRRORING_DRIVER   = $00000008;
  DISPLAY_DEVICE_VGA                = $00000010;
Begin
  lbMonitorList.Items.Add('------------------ Displays ----------------');

  Cntr := 0;
  Info.cb := SizeOf(Info);
  While EnumDisplayDevices(Nil, Cntr, Info, 0) Do
  Begin
    lbMonitorList.Items.Add('* Device '+IntToStr(Cntr)+':');
    lbMonitorList.Items.Add('   DeviceName : '+Info.DeviceName);
    lbMonitorList.Items.Add('   DeviceString: '+Info.DeviceString);

    OldPos := lbMonitorList.Items.Add('   StateFlags:  ');

    If ( Info.StateFlags And DISPLAY_DEVICE_ATTACHED_TO_DESKTOP ) = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP Then
      lbMonitorList.Items.Add('     + Display Device Attached To Desktop')
    Else
      lbMonitorList.Items.Add('     - Display Device Attached To Desktop');

    If ( Info.StateFlags And DISPLAY_DEVICE_MULTI_DRIVER ) = DISPLAY_DEVICE_MULTI_DRIVER Then
      lbMonitorList.Items.Add('     + Display Device Multi Driver')
    Else
      lbMonitorList.Items.Add('     - Display Device Multi Driver');

    If ( Info.StateFlags And DISPLAY_DEVICE_PRIMARY_DEVICE ) = DISPLAY_DEVICE_PRIMARY_DEVICE Then
      lbMonitorList.Items.Add('     + Display Device Primary Device')
    Else
      lbMonitorList.Items.Add('     - Display Device Primary Device');

    If ( Info.StateFlags And DISPLAY_DEVICE_MIRRORING_DRIVER ) = DISPLAY_DEVICE_MIRRORING_DRIVER Then
      lbMonitorList.Items.Add('     + Display Device Mirroring Driver')
    Else
      lbMonitorList.Items.Add('     - Display Device Mirroring Driver');

    If ( Info.StateFlags And DISPLAY_DEVICE_VGA ) = DISPLAY_DEVICE_VGA Then
      lbMonitorList.Items.Add('     + Display Device VGA')
    Else
      lbMonitorList.Items.Add('     - Display Device VGA');


    AdapterName := StrAlloc(SizeOf(Info.DeviceName));
    StrCopy(AdapterName, Info.DeviceName);
    EnumDisplayDevices(AdapterName, 0, Info, 0);
    lbMonitorList.Items.Insert(OldPos, '   Monitorname : ' + Info.DeviceString);
    StrDispose(AdapterName);

    Inc(Cntr);
  End;
End;
lbMonitorList = TListBox.

Der Code ist sehr alt und daher werkelt der noch mit StrAlloc(), StrCopy() und StrDispose() anstatt mit SetLength() und AnsiStrings. Es fehlen try/finally Blöcke, etc - aber das umzusetzen sollte ja nicht das Problem sein.

/EDIT2:
Wie auch in der MSDN zu lesen war auf der oben verlinkten EnumDisplayDevices():
Zitat:

Zitat von MSDN EnumGetDisplayDevice()
To obtain information about a display monitor, first call EnumDisplayDevices with lpDevice set to NULL. The device name is returned in lpDisplayDevice. Use this value in lpDevice and set iDevNum to zero in a second call to EnumDisplayDevices. DISPLAY_DEVICE.DeviceString subsequently returns the monitor name.

/EDIT3:
Mein geposteter Code geht immer fest von nur einem Monitor pro Device aus. Bei manchen Karten (z.B. Matrox Karten im "nicht-Windows" MultiMon Betrieb oder auch Dual Link-DVI Karten für übergrosse LCD/TFTs (Apple's 30"er z.B.)) sollten hier auch mehr als einen Monitor pro Device liefern. Um diese auch zu erhalten, einfach eine Schleife basteln um den zweiten EnumDisplayDevices() Aufruf am Ende in der While Schleife.

/EDIT4:
... und dabei nicht vergessen die Variable (2. Parameter) pro Aufruf zu inkrementieren.

MfG
Muetze1

Robert Marquardt 19. Apr 2006 15:18

Re: Name vom Monitor abfragen
 
Alles was unter HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum steht kann immer auch mit SetupDi-funktionen aus dem Setup API aufgezaehlt werden.
Die Unterschluessel wie DISPLAY benennen dabei einen Bus (der virtuell sein kann).
Ich vermute mal das EnumDisplayDevices intern schlicht auf den SetupDi-Funktionen aufsetzt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz