![]() |
Re: Name der Grafikkarte auslesen, wie?
Zitat:
Zitat:
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:
Zitat:
Delphi-Quellcode:
Und nur wenn die Stringvariable also etwas enthält, wird der Wert in die Listbox eingetragen.
// 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 := ''; 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. |
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] |
Re: Name der Grafikkarte auslesen, wie?
Zitat:
Delphi-Quellcode:
Wert := "Dein Wert aus der Registry";
if Pos('display', LowerCase(Wert)) > 0 then begin { passt... } end; |
Re: Name der Grafikkarte auslesen, wie?
Zitat:
Delphi-Quellcode:
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
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 := '';
Delphi-Quellcode:
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.
if Reg.ValueExists('FriendlyName') then
S := Reg.ReadString('FriendlyName') else 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; |
AW: Name der Grafikkarte auslesen, wie?
Warum zeigt es unter win7/8/10 davor soviel müll an, kann man das vermeiden?
|
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 ![]()
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; |
AW: Name der Grafikkarte auslesen, wie?
Mit WMI-Win32_VideoController:
Delphi-Quellcode:
Ergebnis Beispiel:
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; 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 19:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz