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