Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#5

Re: Name vom Monitor abfragen

  Alt 19. Apr 2006, 15:00
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 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
  Mit Zitat antworten Zitat