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/)
-   -   Delphi Name der Grafikkarte auslesen, wie? (https://www.delphipraxis.net/15334-name-der-grafikkarte-auslesen-wie.html)

Delphi-Noobie 26. Jan 2004 17:54


Name der Grafikkarte auslesen, wie?
 
Hi,

Wie kann ich den Namen der Grafikkarte im Computer in einem Label oder sonstwas anzeigen lassen??
thx

Alter Mann 31. Jan 2004 10:32

Re: Name der Grafikkarte auslesen, wie?
 
Hallo Delphi-Noobie,

den Namen Deiner Grafikkarte findest Du in der Registry unter "HKEY_LOCAL_MACHINE/.../Enum/PCI".
Einfach durchlaufen und nach "Class->Display" suchen und dort dann den Wert von "DeviceDesc" auslesen.
Das wars.

Delphi-Noobie 31. Jan 2004 13:04

Re: Name der Grafikkarte auslesen, wie?
 
Jo das hab ich auch hinbekommen, in der Registry bis ..\PCI auszulesen, jedoch heisst ab diesen Ordner der nächste Ordner der zur Grafikkarte fürhrt bei jeden Pc anders! könntest du villeicht nen Code schreiben wie ich das trotzdem hinbekomme? THX

Alter Mann 31. Jan 2004 18:03

Re: Name der Grafikkarte auslesen, wie?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi, Delphi-Noobie,

ich hoffe Du bist es Wert :wink:

Delphi-Quellcode:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    RegConst : String;
    procedure FillList;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses Registry;

procedure TForm1.FormCreate(Sender: TObject);
begin
  if Win32Platform = VER_PLATFORM_WIN32_WINDOWS   then RegConst := 'Enum\PCI';
  if Win32Platform = VER_PLATFORM_WIN32_NT   then RegConst := 'SYSTEM\CurrentControlSet\Enum\PCI';
  FillList;
end;

procedure TForm1.FillList;
var
  Reg,
  Entry,
  Items     : TRegistry;
  RegEntries,
  EntryList,
  ItemList  : TStringList;
  R, E, I   : Integer;
  S         : String;
begin
  Reg := TRegistry.Create(KEY_ALL_ACCESS);
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKeyReadOnly(RegConst) then
    begin
      RegEntries := TStringList.Create;
      try
        Reg.GetKeyNames(RegEntries);
        Reg.CloseKey;
        for R := 0 to RegEntries.Count - 1 do
        begin
          Entry := TRegistry.Create(KEY_ALL_ACCESS);
          try
             Entry.RootKey := HKEY_LOCAL_MACHINE;
             if Entry.OpenKeyReadOnly(RegConst + '\' + RegEntries.Strings[R]) then
             begin
               EntryList := TStringList.Create;
               Entry.GetKeyNames(EntryList);
               Entry.CloseKey;
               for E := 0 to EntryList.Count - 1 do
               begin
                 Items := TRegistry.Create(KEY_ALL_ACCESS);
                 try
                    Items.RootKey := HKEY_LOCAL_MACHINE;
                    if Items.OpenKeyReadOnly(RegConst + '\' + RegEntries.Strings[R] + '\' + EntryList.Strings[E]) then
                    begin
                      ItemList := TStringList.Create;
                      Items.GetValueNames(ItemList);
                      S := Items.ReadString('FriendlyName');
                      if S = '' then
                      S := Items.ReadString('DeviceDesc');
                      if ListBox1.Items.IndexOf(S) = -1 then ListBox1.Items.Add(S);
                      Items.CloseKey;
                    end;
                 finally
                    Items.Free;
                 end;
               end;
               Entry.CloseKey;
             end;
          finally
             Entry.Free;
          end;
        end;
      finally
         RegEntries.Free;
      end;
    end;
  finally
     Reg.Free;
  end;
end;

end.
Die lauffähige Variante gibt es hier:

Luckie 31. Jan 2004 21:00

Re: Name der Grafikkarte auslesen, wie?
 
Warum drei TRegistry Objekte? :gruebel:

Und warum mit KEY_ALL_ACCESS? Unter NT ff. bei nicht Admins dürfte das krachen. Da du sowieso nur lesen willst, warumm dann Schreibrechte erzwingen?

Delphi-Noobie 31. Jan 2004 22:44

Re: Name der Grafikkarte auslesen, wie?
 
Erstmal vielen Dank @ Alter Mann! :roll:

Jedoch gibt er mir in der Listbox wieder sehr viele Dateien aus. An erster und 2. Stelle ist die Grafikkarte aber danach kommt noch mehr Müll ca.20 weitere Dateien. er soll aber nur Die grafikkarke rausholen! :wall:

Alter Mann 1. Feb 2004 08:33

Re: Name der Grafikkarte auslesen, wie?
 
Moin, Moin

Lucki um Deine Fragen zu beantworten: weil es schnell gehen sollte. Habe das ganze Live geschrieben
und eingefügt; Da kommt es nur darauf an das es läuft, oder?

Delphi-Noobie: Es ist ein Beispiel; Fertige Arbeit gibt es nicht und ein bischen "Schmalz" muss
schon jeder selber reinstecken. Wenn in der Listbox nur die Grafikkarte auftauchen soll dann
musst Du nur eine entsprechende Bedingung einbauen, welche habe ich schon einmal gepostet, s.o.
Und das "WIE" entnehme dem Beispiel-Code.

Welche Erfahrungen hast Du mit dem Proggen?

Delphi-Noobie 1. Feb 2004 08:59

Re: Name der Grafikkarte auslesen, wie?
 
Erfahrung nicht viel, da ich erst vor nen halben jahr angefangen habe mit Delphi und jetzt wollte ich alles lernen, was mit System auslesen zu tun hat ^^. zu deinen Code: Er sucht alle Strings raus von Devicedesk aber es gibt ja in der Registry 20 Ordner wo überall Devicedesk steht und immer was anderes, daher kommen in der Listbox auch 20 andere Namen noch. Ich hab das jetzt so gemacht, dass er alle Zeilen bis auf die erste in der Listbox löscht, dass nur nur noch die Grafikkarte angezeigt wird. Oder geht das auf anderen Betriebssystemen nicht, weil da die Grafikkarte an 2 Stelle oder so angezeigt wird?

MathiasSimmack 1. Feb 2004 10:47

Re: Name der Grafikkarte auslesen, wie?
 
Zitat:

Zitat von Delphi-Noobie
Er sucht alle Strings raus von Devicedesk aber es gibt ja in der Registry 20 Ordner wo überall Devicedesk steht und immer was anderes, daher kommen in der Listbox auch 20 andere Namen noch. Ich hab das jetzt so gemacht, dass er alle Zeilen bis auf die erste in der Listbox löscht, dass nur nur noch die Grafikkarte angezeigt wird. Oder geht das auf anderen Betriebssystemen nicht, weil da die Grafikkarte an 2 Stelle oder so angezeigt wird?

A) das wäre möglich und B) wird nicht jeder die gleiche Grafikkarte wie du haben, so dass du auch den Namen, bspw. "ATI Radeon ..." (oder was immer bei dir drin steht) nicht benutzen kannst.

Mach doch einfach mal deinen Registry-Editor auf und suche den o.g. Hauptschlüssel. Also abhängig von deinem Windows entweder "Enum\PCI" (9x) oder "SYSTEM\CurrentControlSet\Enum\PCI" (NT). Hier findest du die entsprechenden Unterschlüssel, die vom Code in die Stringlisten geladen werden. Wenn deine Grafikkarte an erster Stelle angezeigt wird, dann kannst du allgemein davon ausgehen, dass auch der erste dieser Unterschlüssel für deine GraKa zuständig ist. (Zumindest war´s bei mir so.) Und dann schau dir mal die ganzen Einträge an, wo du u.a. auch "DeviceDesk" usw. findest. Ich verweise dich auf den "Class"-Eintrag - der müsste dir weiterhelfen.


@Alter Mann: Ich habe mal dein Live-Konzert abgemischt. ;) Auf die String-Variable "RegConst" in der Form-Deklaration kannst du so verzichten, außerdem flogen noch ein paar Variablen raus:
Delphi-Quellcode:
procedure TForm1.FillList;
const
  RegConst  : array[boolean]of string =
    ('Enum\PCI','SYSTEM\CurrentControlSet\Enum\PCI');
var
  Reg       : TRegistry;
  RegEntries,
  EntryList : TStringList;
  i,
  j         : Integer;
  S         : String;
begin
  Reg := TRegistry.Create(KEY_READ);
  if Reg <> nil then
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;

    RegEntries := TStringList.Create;
    EntryList  := TStringList.Create;

    if(RegEntries <> nil) and (EntryList <> nil) then
    try
      if Reg.OpenKeyReadOnly(RegConst[Win32Platform =
        VER_PLATFORM_WIN32_NT]) then
      try
        Reg.GetKeyNames(RegEntries);
      finally
        Reg.CloseKey;
      end;

      for i := 0 to RegEntries.Count - 1 do
      begin
        EntryList.Clear;

        if Reg.OpenKeyReadOnly(RegConst[Win32Platform =
          VER_PLATFORM_WIN32_NT] + '\' + RegEntries[i]) then
        try
          Reg.GetKeyNames(EntryList);
        finally
          Reg.CloseKey;
        end;

        for j := 0 to EntryList.Count - 1 do
          if Reg.OpenKeyReadOnly(RegConst[Win32Platform =
            VER_PLATFORM_WIN32_NT] + '\' + RegEntries[i] +
            '\' + EntryList[j]) then
          try
            if Reg.ValueExists('FriendlyName') then
              S := Reg.ReadString('FriendlyName')
            else if Reg.ValueExists('DeviceDesc') then
              S := Reg.ReadString('DeviceDesc')
            else
              S := '';

            if(S <> '') and
              (ListBox1.Items.IndexOf(S) = -1) then
            ListBox1.Items.Add(S);
          finally
            Reg.CloseKey;
          end;
      end;
    finally
      EntryList.Free;
      RegEntries.Free;
    end;
  finally
     Reg.Free;
  end;
end;

Delphi-Noobie 1. Feb 2004 11:40

Re: Name der Grafikkarte auslesen, wie?
 
Hey das hat mir echt weiter geholfen mit der Class danke! Ich hab den Code jetzt so umgeschrieben, dass er nur noch der 1. Ordner mit der Grafikkarte ausliest! 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! THX
Delphi-Quellcode:
procedure TForm1.FillList;
const
  RegConst  : array[boolean]of string =
    ('Enum\PCI','SYSTEM\CurrentControlSet\Enum\PCI');
var
  Reg       : TRegistry;
  RegEntries,
  EntryList : TStringList;
  i,
  j         : Integer;
  S         : String;
begin
  Reg := TRegistry.Create(KEY_READ);
  if Reg <> nil then
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;

    RegEntries := TStringList.Create;
    EntryList  := TStringList.Create;

    if(RegEntries <> nil) and (EntryList <> nil) then
    try
      if Reg.OpenKeyReadOnly(RegConst[Win32Platform =
        VER_PLATFORM_WIN32_NT]) then
      try
        Reg.GetKeyNames(RegEntries);
      finally
        Reg.CloseKey;
      end;

      for i := 0 to RegEntries.Count - 1 do
      begin
        EntryList.Clear;

        if Reg.OpenKeyReadOnly(RegConst[Win32Platform =
          VER_PLATFORM_WIN32_NT] + '\' + RegEntries[i]) then
        try
          Reg.GetKeyNames(EntryList);
        finally
          Reg.CloseKey;
        end;

        for j := 0 to EntryList.Count - 1 do
          if Reg.OpenKeyReadOnly(RegConst[Win32Platform =
            VER_PLATFORM_WIN32_NT] + '\' + RegEntries[i] + 
            '\' + EntryList[j]) then
          try
            if Reg.ValueExists('FriendlyName') then
              S := Reg.ReadString('FriendlyName')
              else if reg.ReadString('Class') = 'Display' then 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 := '';

            if(S <> '') then
            label1.caption:=S;
          finally
            Reg.CloseKey;
          end;
      end;
    finally
      EntryList.Free;
      RegEntries.Free;
    end;
  finally
     Reg.Free;
  end;
end;
Das einzigste, was Ihr jetzt braucht is ein Label(label1) und in Form1.create muss stehen: FillList;
Ich hoffe, dass es bei euch auch klappt. Wenn ja bitte schreiben :mrgreen:

MathiasSimmack 1. Feb 2004 14:48

Re: Name der Grafikkarte auslesen, wie?
 
Zitat:

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') = 'Display' then 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:

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.

Delphi-Noobie 1. Feb 2004 15:27

Re: Name der Grafikkarte auslesen, wie?
 
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 :pale: :cry: [/Edit]

FriFra 1. Feb 2004 15:41

Re: Name der Grafikkarte auslesen, wie?
 
Zitat:

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;

MathiasSimmack 1. Feb 2004 16:31

Re: Name der Grafikkarte auslesen, wie?
 
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') = 'Display' then
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;

Roy Altenau 11. Okt 2015 15:34

AW: Name der Grafikkarte auslesen, wie?
 
Warum zeigt es unter win7/8/10 davor soviel müll an, kann man das vermeiden?

Remko 20. Okt 2015 21:23

AW: Name der Grafikkarte auslesen, wie?
 
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;
]

hathor 20. Okt 2015 23:48

AW: Name der Grafikkarte auslesen, wie?
 
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


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