AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Name der Grafikkarte auslesen, wie?
Thema durchsuchen
Ansicht
Themen-Optionen

Name der Grafikkarte auslesen, wie?

Ein Thema von Delphi-Noobie · begonnen am 26. Jan 2004 · letzter Beitrag vom 21. Okt 2015
Antwort Antwort
Seite 2 von 2     12   
MathiasSimmack
(Gast)

n/a Beiträge
 
#11

Re: Name der Grafikkarte auslesen, wie?

  Alt 1. Feb 2004, 15:48
Zitat von Delphi-Noobie:
Ich hoffe, dass es so richtig ist und würde mich freuen, wenn ihr den Code auch mal ausprobiert und sagt ob nur die Grafikkarte angezeigt wird!
Bei dem Durcheinander, das du angerichtet hast, wär´s ein Wunder:
Zitat:
Delphi-Quellcode:
            if Reg.ValueExists('FriendlyName') then
              S := Reg.ReadString('FriendlyName')
              else if reg.ReadString('Class') = 'Displaythen begin //<- Display wegen Grafikkarte
                   if reg.ValueExists('ParentIDPrefix') then begin //<- Das war bei mir nur im
            if Reg.ValueExists('DeviceDesc') then // 1. ordner vorhanden, deswegen
              S := Reg.ReadString('DeviceDesc') // hab ich es hier eingebaut
              end
              end
            else
              S := '';


Warum hast du das nicht so gelassen wie es vorher war? Ich fürchte, den Sinn dieser Zeilen hast du nämlich nicht verstanden. Der Code vom Alten Mann ging von folgenden Bedingungen aus:
Zitat:
Den Eintrag mit dem Namen "FriendlyName" lesen. Wenn das Ergebnis ein Leerstring ist (weil der Eintrag vielleicht nicht existiert!), dann den Eintrag "DeviceDesc" lesen.
Schau dir seinen Code noch mal an!
Zitat von Alter Mann:
Delphi-Quellcode:
                      S := Items.ReadString('FriendlyName');
                      if S = 'then
                      S := Items.ReadString('DeviceDesc');
                      if ListBox1.Items.IndexOf(S) = -1 then ListBox1.Items.Add(S);
Ich hab´s bei mir nur so geändert, dass geprüft wird, ob der jeweilige Eintrag vorhanden ist, und abhängig davon wird er dann ausgelesen:
Delphi-Quellcode:
// existiert "FriendlyName"?
if Reg.ValueExists('FriendlyName') then
  // Ja, dann lesen
  S := Reg.ReadString('FriendlyName')
// bzw. existiert "DeviceDesc"?
else if Reg.ValueExists('DeviceDesc') then
  // Ja, dann eben den auslesen
  S := Reg.ReadString('DeviceDesc')
// nix davon ist da, so ein Sch***
else
  S := '';
Und nur wenn die Stringvariable also etwas enthält, wird der Wert in die Listbox eingetragen.

Da du es jetzt auf Grafikkarten abgesehen hast, fragst du vor dem Eintragen in die Listbox (oder wohin auch immer) ab, ob der "Class"-Eintrag den Wert "DISPLAY" enthält. Die Prüfung von "ParentIDPrefix" würde ich lassen, den Eintrag gibt´s bei mir bspw. nicht - jedenfalls nicht im Schlüssel meiner GraKa.
Bei mir wird der Wert "DISPLAY" übrigens groß geschrieben. Du solltest also beim Auslesen und Prüfen des Wertes dafür sorgen, dass die Schreibweise nicht berücksichtigt wird.
  Mit Zitat antworten Zitat
Delphi-Noobie

Registriert seit: 28. Nov 2003
102 Beiträge
 
#12

Re: Name der Grafikkarte auslesen, wie?

  Alt 1. Feb 2004, 16:27
Jo das mit der Rechtschreibung hab ich auch grad erst mitbekommen! Bei meinem Pc heißt es: Display bein nem anderen: DISPLAY und wieder bei nem anderen: "DISPLAY" <--mit Anführungszeichen Ich hab das jetzt mit "or" alles verbunden damit er alles ausliest aber du hast ja geschrieben, dass es ne Möglichkeit gibt, dass die Rechtschreibung nicht beachtet wird? Wie geht die denn?

[Edit] Wieso is denn der Code Müll? Ich habs auf 3 Rechnern ausprobiert und überall hat er die grafikkarte richtig ausgelesen. Und das mit dem Friendlyname, ich weiß gar nicht was damit eingendlich gemeint ist [/Edit]
Wieviel Lösungen hat die Gleichung x^13=1? .... 13!
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#13

Re: Name der Grafikkarte auslesen, wie?

  Alt 1. Feb 2004, 16:41
Zitat von Delphi-Noobie:
Jo das mit der Rechtschreibung hab ich auch grad erst mitbekommen! Bei meinem Pc heißt es: Display bein nem anderen: DISPLAY und wieder bei nem anderen: "DISPLAY" <--mit Anführungszeichen Ich hab das jetzt mit "or" alles verbunden damit er alles ausliest aber du hast ja geschrieben, dass es ne Möglichkeit gibt, dass die Rechtschreibung nicht beachtet wird? Wie geht die denn?
Du könntest es z.B. so ,machen:
Delphi-Quellcode:
Wert := "Dein Wert aus der Registry";
if Pos('display', LowerCase(Wert)) > 0 then
begin

  { passt... }

end;
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#14

Re: Name der Grafikkarte auslesen, wie?

  Alt 1. Feb 2004, 17:31
Zitat:
Wieso is denn der Code Müll?
Ich rück´s mal ein, dann siehst du das Problem:
Delphi-Quellcode:
if Reg.ValueExists('FriendlyName') then
  S := Reg.ReadString('FriendlyName')

else if reg.ReadString('Class') = 'Displaythen
begin
  if reg.ValueExists('ParentIDPrefix') then
  begin
    if Reg.ValueExists('DeviceDesc') then
      S := Reg.ReadString('DeviceDesc')
  end
end

else
  S := '';
Auf einigen Systemen (Win XP, IMHO) gibt es den Eintrag "FriendlyName", der meiner Meinung nach aber mit "DeviceDesc" (Device Description) identisch sein müsste. Solange der Eintrag nicht vorhanden ist, solange funktioniert deine Idee von oben. Ist er allerdings da, dann wird er auf Grund dieser Bedingung
Delphi-Quellcode:
if Reg.ValueExists('FriendlyName') then
  S := Reg.ReadString('FriendlyName')

else
auch ausgelesen, und alles nach dem "else" spielt keine Rolle mehr! Nun weiß ich nicht, wann "FriendlyName" vorhanden ist und wann nicht. Es wäre aber durchaus denkbar, dass er auch mal von einem GraKa-Treiber eingetragen wird.

Mit solchen Möglichkeiten musst du rechnen, um so viele Problemfälle wie möglich abzufangen. Dass es bei dir funktioniert, bedeutet nicht, dass es auch auf einem anderen System so sein muss. Aus dem Grund würde ich das Auslesen von "FriendlyName" bzw. "DeviceDesc" so lassen, wie es ursprünglich in meinem Code stand, und dann das Zuweisen an das Label vom Vorhandensein der "Display"-Klasse abhängig machen - in der Form wie das FriFra schon angedeutet hat:
Delphi-Quellcode:
if(Reg.ValueExists('Class')) and
  (CompareText(Reg.ReadString('Class'),'Display') = 0) and
  (S <> '') then
Label1.Caption := S;
  Mit Zitat antworten Zitat
Roy Altenau

Registriert seit: 7. Okt 2015
3 Beiträge
 
#15

AW: Name der Grafikkarte auslesen, wie?

  Alt 11. Okt 2015, 16:34
Warum zeigt es unter win7/8/10 davor soviel müll an, kann man das vermeiden?
  Mit Zitat antworten Zitat
Benutzerbild von Remko
Remko

Registriert seit: 10. Okt 2006
Ort: 's-Hertogenbosch, Die Niederlande
222 Beiträge
 
RAD-Studio 2010 Arc
 
#16

AW: Name der Grafikkarte auslesen, wie?

  Alt 20. Okt 2015, 22:23
I think querying registry is not the best approach, especially as some systems have multiple gpu's (eg NVidia Optimus).
You can get this information by calling MSDN-Library durchsuchenEnumDisplayDevices in a loop, eg:

Delphi-Quellcode:
function TForm1.DumpFlags(const Flags: DWORD): String;
begin
  Result := '';
  if Flags and DISPLAY_DEVICE_ACTIVE = DISPLAY_DEVICE_ACTIVE then
    Result := Result + 'DISPLAY_DEVICE_ACTIVE | ';
  if Flags and DISPLAY_DEVICE_MIRRORING_DRIVER = DISPLAY_DEVICE_MIRRORING_DRIVER then
    Result := Result + 'DISPLAY_DEVICE_MIRRORING_DRIVER | ';
  if Flags and DISPLAY_DEVICE_MODESPRUNED = DISPLAY_DEVICE_MODESPRUNED then
    Result := Result + 'DISPLAY_DEVICE_MODESPRUNED | ';
  if Flags and DISPLAY_DEVICE_PRIMARY_DEVICE = DISPLAY_DEVICE_PRIMARY_DEVICE then
    Result := Result + 'DISPLAY_DEVICE_PRIMARY_DEVICE | ';
  if Flags and DISPLAY_DEVICE_REMOVABLE = DISPLAY_DEVICE_REMOVABLE then
    Result := Result + 'DISPLAY_DEVICE_REMOVABLE | ';
  if Flags and DISPLAY_DEVICE_VGA_COMPATIBLE = DISPLAY_DEVICE_VGA_COMPATIBLE then
    Result := Result + 'DISPLAY_DEVICE_VGA_COMPATIBLE | ';

  if Result.Length > 0 then
    Result := Copy(Result, 1, Result.Length - 3);
end;

procedure TForm1.btnEnumClick(Sender: TObject);
var
  i, j: Integer;
  DisplayDevice: DISPLAY_DEVICE;
  MonitorDevice: DISPLAY_DEVICE;
  bRes: Boolean;
  DeviceName: String;
begin
  i := 0;

  for i := 0 to 255 do
  begin
    ZeroMemory(@DisplayDevice, SizeOf(DisplayDevice));
    DisplayDevice.cb := SizeOf(DisplayDevice);
    bRes := EnumDisplayDevices(nil, i, DisplayDevice, 0);
    if not bRes then
      Break;

    Memo1.Lines.Add(Format('iDevNum : %d', [i]));
    Memo1.Lines.Add(Format('DeviceName : %s', [DisplayDevice.DeviceName]));
    Memo1.Lines.Add(Format('DeviceString: %s', [DisplayDevice.DeviceString]));
    Memo1.Lines.Add(Format('Flags : %s', [DumpFlags(DisplayDevice.StateFlags)]));

    for j := 0 to 255 do
    begin

      DeviceName := DisplayDevice.DeviceString;
      ZeroMemory(@MonitorDevice, SizeOf(MonitorDevice));
      MonitorDevice.cb := SizeOf(MonitorDevice);

      bRes := EnumDisplayDevices(DisplayDevice.DeviceName, j, MonitorDevice, 0);
      if not bRes then
        Break;

      Memo1.Lines.Add(Format(' iDevNum : %d', [j]));
      Memo1.Lines.Add(Format(' DeviceName : %s', [MonitorDevice.DeviceName]));
      Memo1.Lines.Add(Format(' DeviceString: %s', [MonitorDevice.DeviceString]));
      Memo1.Lines.Add(Format(' Flags : %s', [DumpFlags(MonitorDevice.StateFlags)]));
    end;
  end;
end;
]
See my blog blog
See our Jedi blog
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#17

AW: Name der Grafikkarte auslesen, wie?

  Alt 21. Okt 2015, 00:48
Mit WMI-Win32_VideoController:

Delphi-Quellcode:
uses ...Winapi.ActiveX, System.Win.comobj,...

const
MyArray : Array[1..21]of String =(
'Other',
'Unknown',
'Running/Full Power',
'Warning',
'In Test',
'Not Applicable',
'Power Off',
'Off Line',
'Off Duty',
'Degraded',
'Not Installed',
'Install Error',
'Power Save - Unknown',
'Power Save - Low Power Mode',
'Power Save - Standby',
'Power Cycle',
'Power Save - Warning',
'Paused',
'Not Ready',
'Not Configured',
'Quiesced - temporarily inactive');

Procedure GRAFIK;
const wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject : OLEVariant;
  oEnum : IEnumvariant;
  iValue : LongWord;
  i : Integer;
begin;
//Form1.Memo1.clear;
i:=0;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\cimv2', '', '');
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_VideoController','WQL',wbemFlagForwardOnly);
  oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin
      if not VarIsNull(FWbemObject.DeviceID) then
      Form1.Memo1.lines.add(Format('Device ID %s',[String(FWbemObject.DeviceID)]));
// if not VarIsNull(FWbemObject.PNPDeviceID) then
// Form1.Memo1.lines.add(Format('PNP Device ID %s',[String(FWbemObject.PNPDeviceID)]));
    if not VarIsNull(FWbemObject.Description) then
      Form1.Memo1.lines.add(Format('Description %s',[String(FWbemObject.Description)]));

// if not VarIsNull(FWbemObject.Caption) then
// Form1.Memo1.lines.add(Format('Caption %s',[String(FWbemObject.Caption)]));
    if not VarIsNull(FWbemObject.Availability) then BEGIN
// Form1.Memo1.lines.add(Format('Availibility %s',[String(FWbemObject.Availability)]));
      Form1.Memo1.lines.add(MyArray[Integer(FWbemObject.Availability)]); END;
// if not VarIsNull(FWbemObject.VideoProcessor) then
// Form1.Memo1.lines.add(Format('VideoProcessor %s',[String(FWbemObject.VideoProcessor)]));
    inc(i);
    if I=1 then
    BEGIN
    Form1.Label1.caption:= MyArray[Integer(FWbemObject.Availability)];
    Form1.Memo1.lines.add('----------------------------------------------');
    END;
    if I=2 then Form1.Label2.caption:= MyArray[Integer(FWbemObject.Availability)];
    FWbemObject:=Unassigned;
  end;
end;

procedure TForm1.ButtonClick(Sender: TObject);
begin
GRAFIK;
end;
Ergebnis Beispiel:
Device ID VideoController1
Description Intel(R) HD Graphics 4000
Running/Full Power
----------------------------------------------
Device ID VideoController2
Description NVIDIA GeForce GT 635M
Off Line
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 10:36 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