AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

EnumDisplayDevices und DISPLAY_DEVICE

Ein Thema von Mattze · begonnen am 15. Jul 2013 · letzter Beitrag vom 15. Jul 2013
Antwort Antwort
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#1

EnumDisplayDevices und DISPLAY_DEVICE

  Alt 15. Jul 2013, 19:12
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
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: EnumDisplayDevices und DISPLAY_DEVICE

  Alt 15. Jul 2013, 20:01
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;
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#3

AW: EnumDisplayDevices und DISPLAY_DEVICE

  Alt 15. Jul 2013, 20:54
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
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: EnumDisplayDevices und DISPLAY_DEVICE

  Alt 15. Jul 2013, 21:00
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  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 12:03 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