Delphi-PRAXiS
Seite 1 von 2  1 2   

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 18: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 11: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 14: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 19: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 22: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 23: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 09: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 09: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 11: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 12: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:


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:18 Uhr.
Seite 1 von 2  1 2   

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