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/)
-   -   EnumDisplayDevices und DISPLAY_DEVICE (https://www.delphipraxis.net/175758-enumdisplaydevices-und-display_device.html)

Mattze 15. Jul 2013 19:12

EnumDisplayDevices und DISPLAY_DEVICE
 
Hallo,

die Display_Device-Struktur wird bei Microsoft anders definiert, als sie unter Delphi definiert ist. (http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx)
Es geht insbesondere um die beiden Zeichenketten am Ende (DeviceID, DeviceKey).
Ich denke mal, das die GUID in DeviceID eingetragen wird. Jedenfall, wenn ich die dwFlags unter EnumDisplayDevices richtig verstehe (http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx)
Und genau die möchte ich zu jeder Grafikkarte, die ich vorher mit EnumDisplayDevices ermittelt habe, auch bekommen.

Aber EnumDisplayDevices will diese Display-Devices-Struktur nicht.
Wie kriege ich das hin oder sonstwie die gewünschte GUID?
Nur den bekannten PCI-Zweig der Registry abzusuchhen, wäre wahrscheinlich zuwenig, oder?

(Bsp.: EnumDisplayDevices gibt gibt 5 Einträge zurück. Im PCI-Zweig habe ich bisher nur 2 gefunden.)

Gruß
Matthias

Union 15. Jul 2013 20:01

AW: EnumDisplayDevices und DISPLAY_DEVICE
 
Dann erweiter doch die Struktur um die beiden neuene Felder, hier mal ein Beispiel:
Delphi-Quellcode:
type
  _DISPLAY_DEVICEA_EX = packed record
     cb: DWORD;
     DeviceName: array[0..31] of AnsiChar;
     DeviceString: array[0..127] of AnsiChar;
     StateFlags: DWORD;
     DeviceID: array[0..127] of AnsiChar;
     DeviceKey: array[0..127] of AnsiChar;
  end;
  TDisplayDeviceAEx = _DISPLAY_DEVICEA_EX;


  function EnumDisplayDevicesAEx(Unused: Pointer; iDevNum: DWORD;
     var lpDisplayDevice: TDisplayDeviceAEx; dwFlags: DWORD): BOOL; stdcall;

  function EnumDisplayDevicesAEx; external user32 name 'EnumDisplayDevicesA';
Und Dann benutzt Du die ganz normal:
Delphi-Quellcode:
procedure TForm1.Image1DblClick(Sender: TObject);
   function B2Str(AValue : Boolean; ATrue : string = 'True'; AFalse : string = 'False') : string;
   begin
      if AValue then
         result := ATrue
      else
         result := AFalse;
   end;

var
   Sl : TStringList;
   i, c : integer;
   r : TRect;
   Device : _DISPLAY_DEVICEA_EX;
begin
   Sl := TStringList.Create;
   c := GetMonitorCount;
   Sl.Add(Format('Monitore: %d', [c]));
   for i := 0 to c-1 do
   begin
      r := GetMonitorBoundsRect(i);
      Sl.Add(Format('Monitor %d (%d, %d, %d, %d) %s', [i, r.Left, r.Top, r.Right, r.Bottom, GetMonitorDevice(i)]));
   end;
   ZeroMemory(@Device, SizeOf(Device));
   Device.cb := SizeOf(Device);
   i := 0;
   while EnumDisplayDevicesAEx(nil, i, Device, 0) do
   begin
      Sl.Add(Format('Device #%d: %s (%s) %x %s %s %s %s',
         [i,
          StrPas(Device.DeviceName),
          StrPas(Device.DeviceString),
          Device.StateFlags,
          B2Str(Boolean(DISPLAY_DEVICE_ATTACHED_TO_DESKTOP and Device.StateFlags), 'Desktop', 'nix'),
          B2Str(Boolean(DISPLAY_DEVICE_PRIMARY_DEVICE and Device.StateFlags), 'Primär', 'nix'),
          StrPas(Device.DeviceID),
          StrPas(Device.DeviceKey)
         ]));
      inc(i);
   end;
   ShowMessage(Sl.Text);
   Sl.Free;
end;

Mattze 15. Jul 2013 20:54

AW: EnumDisplayDevices und DISPLAY_DEVICE
 
Hallo,

vielen Dank.
Ich hatte das probiert, zu erweitern.
Aber dann das schon definierte EnumDisplayDevicesA mit der neuen Struktur versucht. Das ging (natürlich) nicht.
Da habe ich offenbar zu sehr um die Ecke gedacht.
Ich dachte, dass die Parameterfestlegung in der Funktion mit der Windowsfestlegung in der user32 übereinstimmen muss und auch überprüft wird. Wird sie aber offenbar nicht, weil es so und so geht. Deshalb kann man das "einfach" ändern. Hätte ich nie vermutet!
Wieder was gelernt. Danke!

Gruß
Mattze

Union 15. Jul 2013 21:00

AW: EnumDisplayDevices und DISPLAY_DEVICE
 
Vielleicht ginge es auch kürzer aber unsauberer mit einem zweiten Record und absolute ohne die Funktion umzudeklarieren. Was Windows zurückgibt hängt ja nur von cbSize ab. Hab ich aber nicht getestet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:29 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