Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi energiesparplan unter vista ändern (https://www.delphipraxis.net/122266-energiesparplan-unter-vista-aendern.html)

Oliver1983 15. Jun 2009 21:36

Re: energiesparplan unter vista ändern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

ich habe mal das Programm etwas "aufgeräumt" bzw. etwas schöner gemacht Icons sowie ein TrayIcon ist nun auch drin mit Popup Menü
nun stehe ich aber vor einem Problem ich würde auch gerne die einzelheiten des EnergieSchemes auflisten, also die Einstellung die gespeichert wurden anzeigen lassen!

Die GUID's habe ich mittels in einer CMD Box mit "powercfg /Q" Befehl ausgelesen, aber wie erstelle ich nun richtig die Functionen im Delphi Programm?

Anbei das Programm auf wunsch auch der QuellCode
dazu sei gesagt die JediVCL und die LMD Tools müssen vorhanden sein

um jede hilfe sei gedankt

gruss olli

Mithrandir 15. Jun 2009 21:48

Re: energiesparplan unter vista ändern
 
Für Betriebssysteme < Windows Vista vielleicht noch ne kleine Abfrage einbauen. Is' hübscher als ne AV. :stupid:

Mr_G 16. Jun 2009 01:03

Re: energiesparplan unter vista ändern
 
Zitat:

Zitat von Oliver1983
...nun stehe ich aber vor einem Problem ich würde auch gerne die einzelheiten des EnergieSchemes auflisten, also die Einstellung die gespeichert wurden anzeigen lassen!

Ich weiß zwar nicht genau was du meinst aber aus einem Bauchgefühl heraus würde ich sagen der Parameter SubGroupOfPowerSettingsGuid der Funktion PowerEnumerate ist dein Freund ;)
Einfach mal einen Blick in die MSDN-Library werfen: MSDN-Library durchsuchenPowerEnumerate

Oliver1983 16. Jun 2009 20:39

Re: energiesparplan unter vista ändern
 
So habe mal weiter gemacht bisher hat alles gut funktioniert nun komme ich aber nicht weiter!!!

Wenn ich nun den Minimum wert der CPU anzeigen lassen will mit dieser Function

bekomme ich nichts zurück bzw. mein Label bleibt leer

hier das wesentliche:
Delphi-Quellcode:

{$EXTERNALSYM PowerReadValueMin}
function PowerReadValueMin (RootPowerKey: HKEY;
  const SubGroupOfPowerSettingGuid: PGUID; const PowerSettingGuid: PGUID;
  Buffer: PUCHAR):
  DWORD; stdcall; external PWR_PROF;

implementation

{$R *.dfm}



function TForm1.getMinValueFromsubGroupSetting(sub_guid:TGUID ; setting_guid:TGUID):string;
var res, size: DWORD;
    b: PWideChar;
begin
  size := 0;

  PowerReadValueMin (0, @sub_guid, @setting_guid, nil);
  GetMem(b, size);
  // Nach dem ersten Aufruf wird size richtig gesetzt.
  res := PowerReadValueMin (0, @sub_guid, @setting_guid, Pointer(b));
  if res = ERROR_SUCCESS then begin
    result := b;
  end
  else
    result := b;

  FreeMem(b);
end;
habe ich irgendwo einen gedanken fehler gemacht?

gruss olli

Mr_G 16. Jun 2009 21:11

Re: energiesparplan unter vista ändern
 
Du hast die Funktion so wie ich das gesehen habe falsch übersetzt:
Delphi-Quellcode:
function PowerReadValueMin(RootPowerKey: HKEY;
  const SubGroupOfPowerSettingsGuid: PGUID; const PowerSettingGuid: PGUID;
  ValueMinimum: PDWORD): DWORD; stdcall; external PWR_PROF;
Bei ValueMinimum übergibst du dann einfach einen Zeiger auf deine DWORD-Variable und schon gehts.

Ich würde aber auch nochmal einen Blick auf deinen Quelltext werfen:
Delphi-Quellcode:
PowerReadValueMin (0, @sub_guid, @setting_guid, nil);
  PowerReadValueMin (0, @sub_guid, @setting_guid, nil);
  GetMem(b, size);
  // Nach dem ersten Aufruf wird size richtig gesetzt.
  {size wurde nie an die Funktion übergeben... wer soll da was richtig setzen?} 
  res := PowerReadValueMin (0, @sub_guid, @setting_guid, Pointer(b));
  if res = ERROR_SUCCESS then begin
    result := b;
  end
  else
    {wozu der Else-Zweig wenn hier das Selbe passiert?} 
    result := b;

Oliver1983 16. Jun 2009 21:26

Re: energiesparplan unter vista ändern
 
[quote="Mr_G"]Du hast die Funktion so wie ich das gesehen habe falsch übersetzt:
Delphi-Quellcode:
function PowerReadValueMin(RootPowerKey: HKEY;
  const SubGroupOfPowerSettingsGuid: PGUID; const PowerSettingGuid: PGUID;
  ValueMinimum: PDWORD): DWORD; stdcall; external PWR_PROF;
Bei ValueMinimum übergibst du dann einfach einen Zeiger auf deine DWORD-Variable und schon gehts.

hmm bei mir geht das immer noch nicht

aufrufen tue ich die Funktion mit
Delphi-Quellcode:

procedure TForm1.PS_getActiveClick(Sender: TObject);
var res, res2: DWORD;
    tmp: PGUID;
    tmp2 : TGUID;
    actindex: integer;
    s : string;
    tray_balloon_title, tray_balloon_hint: string;
begin
  res := PowerGetActiveScheme(0, @tmp);
  if res = ERROR_SUCCESS then
   begin
    label1.caption := 'AKTIV: '+getNameFromPowerScheme(PGuidToTGuid(tmp));
    label2.caption := getDescriptionFromPowerScheme(PGuidToTGuid(tmp));
    label3.Caption := form1.getNameFromsubGroup(PGuidToTGuid(tmp),GUID_PROCESSOR_SETTINGS_SUBGROUP);
    label4.Caption := form1.getNameFromsubGroupSetting(PGuidToTGuid(tmp),GUID_PROCESSOR_SETTINGS_SUBGROUP,GUID_CPU_Minimum);
//    label5.Caption := form1.getMinValueFromsubGroupSetting(PGuidToTGuid(tmp),GUID_PROCESSOR_SETTINGS_SUBGROUP,GUID_CPU_Minimum);
    edit1.text := getMinValueFromsubGroupSetting(GUID_PROCESSOR_SETTINGS_SUBGROUP,GUID_CPU_Minimum);

.
.
.
.
das ist doch richtig oder muss ich da was noch beachten?

gruss olli

Mr_G 16. Jun 2009 22:23

Re: energiesparplan unter vista ändern
 
Jetzt muss ich wieder meine Glaskugel rausholen :glaskugel:
Was geht nicht? Und was soll mir der Code sagen? Ich seh da nur wie du deine eigene Funktion aufrufst.

P.S.: Mir läuft ein kalter Schauer bei der Funktion PGuidToTGuid über den Rücken. Hab mir gerade mal die Implementation angesehen. Ihr solltet euch unbedingt nocheinmal den Umgang mit Pointern ansehen.

Oliver1983 17. Jun 2009 04:05

Re: energiesparplan unter vista ändern
 
Moin,

was ich damit meine ist das ich immer noch kein ergebniss in meinem Label bz. meiner Edit angezeigt bekomme!

Delphi-Quellcode:
function TForm1.getMinValueFromsubGroupSetting(sub_guid:TGUID ; setting_guid:TGUID):string;
var res, size: DWORD;
    b: PWideChar;
begin
  size := 0;

  PowerReadValueMin (0, @sub_guid, @setting_guid, nil);
  GetMem(b, size);
  // Nach dem ersten Aufruf wird size richtig gesetzt.
  res := PowerReadValueMin (0, @sub_guid, @setting_guid, Pointer(b));
  if res = ERROR_SUCCESS then begin
    result := b;
  end
  else
    result := b;

  FreeMem(b);
end;
Wie ich die funktion nun aufrufe weißt du nun, habe es auch geändert was du geschrieben hattest mit dem PDWord

Delphi-Quellcode:
function PowerReadValueMin(RootPowerKey: HKEY;
  const SubGroupOfPowerSettingsGuid: PGUID; const PowerSettingGuid: PGUID;
  ValueMinimum: PDWORD): DWORD; stdcall; external PWR_PROF;
Nur was meinst du damit:?
Zitat:


Bei ValueMinimum übergibst du dann einfach einen Zeiger auf deine DWORD-Variable und schon gehts.

gruss olli

Mr_G 17. Jun 2009 10:38

Re: energiesparplan unter vista ändern
 
Ohne dir zu Nahe treten zu wollen: Du weißt nicht wirklich was du machst, oder? Schau dir doch bitte mal ein Grundlagentutorial an!
Zitat:

Zitat von Oliver1983
Nur was meinst du damit:?

Ich meine was ich sagte:
Delphi-Quellcode:
function TForm1.getMinValueFromsubGroupSetting(sub_guid, setting_guid: TGUID): String;
var val: DWORD;
begin
  if PowerReadValueMin(0, @sub_guid, @setting_guid, @val) = ERROR_SUCCESS then
    Result := IntToStr(val)
  else
    Result := 'Fehler...';
end;
Zitat:

Zitat von Mr_G
Ihr solltet euch unbedingt nocheinmal den Umgang mit Pointern ansehen.


Oliver1983 19. Jun 2009 05:12

Re: energiesparplan unter vista ändern
 
hi,

super habe jetzt einiges rausgefunden, und klappt auch so wie es soll, nun habe ich aber wieder ein problem und zwar bei PowerWriteFriendlyName Function link
bei
__in UCHAR *Buffer,
__in DWORD BufferSize

Buffersize ist eigentlich klar

aber was muss ich bei Buffer übergeben ich bin der meinung entweder PWideString oder PWideChar

Delphi-Quellcode:

{$EXTERNALSYM PowerWriteFriendlyName}
function PowerWriteFriendlyName(RootPowerKey: HKEY; const SchemeGuid: PGUID;
  const SubGroupOfPowerSettingGuid: PGUID; const PowerSettingGuid: PGUID;
  Buffer: PUChar; BufferSize: PDWORD):
  DWORD; stdcall; external PWR_PROF;


function TForm1.setNameToPowerScheme(guid:TGUID; fname: WideString ):string;
var
 res, size: DWORD;
 pfname: PWideChar;
begin
  size := 512;
  StringToWideChar(fname, Pfname, size);


  GetMem(pfname, size);
  //PowerWriteFriendlyName(0, @guid, nil, nil, Pointer(fname), @size);

  res := PowerWriteFriendlyName(0, @guid, nil, nil, Pointer(pfname), @size);
  if res = ERROR_SUCCESS then begin
    result := 'Name geändert';
  end
  else
    result := 'fehler';

 FreeMem(pfname);
end;
ich weiß das die Funktion noch etwas unaufgeräumt aussieht aber ich habe vieles getestet

Hoffe mir kann einer Helfen

gruss olli


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:45 Uhr.
Seite 4 von 5   « Erste     234 5      

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