AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi energiesparplan unter vista ändern

energiesparplan unter vista ändern

Ein Thema von Admirandis · begonnen am 12. Okt 2008 · letzter Beitrag vom 19. Jun 2009
Antwort Antwort
Seite 3 von 5     123 45   
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
39.653 Beiträge
 
Delphi 11 Alexandria
 
#21

Re: energiesparplan unter vista ändern

  Alt 16. Jan 2009, 14:03
nja, wir wollen mal den Parameter lParam nicht außer Acht lassen ...
den kann man nämlich für ganz nette Dinge benutzen
Delphi-Quellcode:
function XPEnumSchemes(uiIndex: UINT; dwName: DWORD; sName: PWideChar;
  dwDesc: DWORD; sDesc: PWideChar; pp: Pointer; lParam: LPARAM): BOOLEAN; stdcall;
begin
  TMemo(lParam).Lines.Add(Format('%d %s --> %s', [uiIndex, sName, sDesc]));
  Result := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
var clb: WRSCHEMESENUMPROC;
begin
  clb := XPEnumSchemes;
  EnumPwrSchemes(@clb, LPARAM(Memo1));
end;

[add]
wieso Trickser?
dieser Parameter ist schließlich für soetwas da
( nja, ich versteh schon den Spaß in deiner Antwort ...
wollte aber nicht, daß hier welche Denken man darf sowas nicht machen )
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#22

Re: energiesparplan unter vista ändern

  Alt 16. Jan 2009, 14:19
Immer diese Trickser...
Jan
  Mit Zitat antworten Zitat
igschliff

Registriert seit: 11. Jan 2009
9 Beiträge
 
#23

Re: energiesparplan unter vista ändern

  Alt 16. Jan 2009, 17:41
Wow, vielen Dank an alle Beteiligten!
Das funktioniert nun wunderbar.
  Mit Zitat antworten Zitat
jDallmeyer

Registriert seit: 29. Nov 2005
34 Beiträge
 
#24

Re: energiesparplan unter vista ändern

  Alt 7. Mär 2009, 11:25
Hallo zusammen,

ich möchte die PowerScheme-Funktionen auch in ein Programm von mir einbauen. Die XP-Variante funktioniert wunderbar, doch bei Vista breche ich mir einen ab. Ich habe folgenden Quelltext zusammengeschustert:

Delphi-Quellcode:
unit Unit1;

interface

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

const PWR_PROF = 'PowrProf.dll';

{$EXTERNALSYM _POWER_DATA_ACCESSOR}
const NO_SUBGROUP_GUID: TGUID = '{fea3413e-7e05-4911-9a71-700331f1c294}';
      GUID_DISK_SUBGROUP: TGUID = '{0012ee47-9041-4b5d-9b77-535fba8b1442}';
      GUID_SYSTEM_BUTTON_SUBGROUP: TGUID = '{4f971e89-eebd-4455-a8de-9e59040e7347}';
      GUID_PROCESSOR_SETTINGS_SUBGROUP: TGUID = '{54533251-82be-4824-96c1-47b60b740d00}';
      GUID_VIDEO_SUBGROUP: TGUID = '{7516b95f-f776-4464-8c53-06167f40cc99}';
      GUID_BATTERY_SUBGROUP: TGUID = '{e73a048d-bf27-4f12-9731-8b2076e8891f}';
      GUID_SLEEP_SUBGROUP: TGUID = '{238C9FA8-0AAD-41ED-83F4-97BE242C8F20}';
      GUID_PCIEXPRESS_SETTINGS_SUBGROUP: TGUID = '{501a4d13-42af-4429-9fd1-a8218c268e20}';

type _POWER_DATA_ACCESSOR = (
  ACCESS_AC_POWER_SETTING_INDEX = 0, // 0x0
  ACCESS_DC_POWER_SETTING_INDEX = 1, // 0x1
  ACCESS_SCHEME = 16, // 0x10
  ACCESS_SUBGROUP = 17, // 0x11
  ACCESS_INDIVIDUAL_SETTING = 18, // 0x12
  ACCESS_ACTIVE_SCHEME = 19, // 0x13
  ACCESS_CREATE_SCHEME = 20 // 0x14
);
{$EXTERNALSYM POWER_DATA_ACCESSOR}
POWER_DATA_ACCESSOR = _POWER_DATA_ACCESSOR;
{$EXTERNALSYM PPOWER_DATA_ACCESSOR}
PPOWER_DATA_ACCESSOR = ^_POWER_DATA_ACCESSOR;

  TForm1 = class(TForm)
    Button1: TButton;
    Memo: TMemo;
    Button2: TButton;
    Button3: TButton;
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    active_guid : TGUID;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

  {$EXTERNALSYM PowerSetActiveScheme}
function PowerSetActiveScheme(UserRootPowerKey: HKEY; const SchemeGUID: PGUID):
  DWORD; stdcall; external PWR_PROF;
{$EXTERNALSYM PowerEnumerate}
function PowerEnumerate(UserRootPowerKey: HKEY; const SchemeGuid: PGUID;
  const SubGroupOfPowerSettingGuid: PGUID; AccessFlag: POWER_DATA_ACCESSOR;
  Index: ULONG; Buffer: PUCHAR; BufferSize: PDWORD):
  DWORD; stdcall; external PWR_PROF;
{$EXTERNALSYM PowerGetActiveScheme}
function PowerGetActiveScheme(UserRootPowerKey: HKEY; Buffer: PUCHAR): DWORD;
  stdcall; external PWR_PROF;
{$EXTERNALSYM PowerReadDescription}
function PowerReadDescription(UserRootPowerKey: HKEY; const SchemeGuid: PGUID;
  const SubGroupOfPowerSettingGuid: PGUID; const PowerSettingGuid: PGUID;
  Buffer: PUCHAR; BufferSize: PDWORD):
  DWORD; stdcall; external PWR_PROF;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var res, size: DWORD;
    i: ULONG;
    tmp: TGUID;
begin
  i := 0;
  size := SizeOf(TGUID);
  repeat
    res := PowerEnumerate(0, nil, nil, ACCESS_SCHEME, i, @tmp, @size);
    if res = ERROR_SUCCESS then begin
      Memo.Lines.Add(GUIDToString(tmp));
      active_guid := tmp;
    end
    else Memo.Lines.Add(inttostr(res));
    Inc(i);
  until res <> ERROR_SUCCESS;
end;

procedure TForm1.Button2Click(Sender: TObject);
var res: DWORD;
    tmp: TGUID;
begin
  res := PowerGetActiveScheme(0, @tmp);
  if res = ERROR_SUCCESS then begin
    Memo.Lines.Add(GUIDToString(tmp));
    active_guid := tmp;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var res, size: DWORD;
    tmp: TGUID;
begin
  size := SizeOf(PGUID);
// res := PowerReadDescription(0, active_guid, nil, nil, @tmp, @size);
  if res = ERROR_SUCCESS then
    Memo.Lines.Add(GUIDToString(tmp))
  else
    Memo.Lines.Add('Fehler -> '+GUIDToString(tmp));
end;

end.
Button1: Auslesen der Schemata und Ausgabe der TGuids in Memo
Button2: Auslesen des aktuellen Schemas und Ausgabe der TGuid in Memo
Button3: Auslesen der Beschreibung zum aktuellen Schema. Hierfür muss vorher entweder Button1 oder Button2 gedrückt worden sein.

Ich habe folgende Probleme:
1. Wenn ich mehrfach auf Button2 drücke, erhalte ich verschiedene Ausgaben. Es sollte imho aber immer die selbe Guid ausgegeben werden.
Delphi-Quellcode:
{0020BB60-3313-0040-8819-500101F71200}
{001FF710-3313-0040-8819-500101F71200}
{0020BB88-3313-0040-8819-500101F71200}
{0020BBB0-3313-0040-8819-500101F71200}
{0020BD10-3313-0040-8819-500101F71200}
{0020BC30-3313-0040-8819-500101F71200}
2. Die Funktionen von Button1 und Button2 liefern Ergebnisse im Format TGUID. Um allerdings mit diesen Guids weiterarbeiten zu können und sie in andere Funktionen zu stecken, benötige ich Daten im Format PGUID. Wie bekomme ich diese Transformation hin? PowerReadDescription und PowerSetActiveScheme erwarten PGUID, ich habe aber nur TGUID.

Gruß,
jDallmeyer
  Mit Zitat antworten Zitat
jDallmeyer

Registriert seit: 29. Nov 2005
34 Beiträge
 
#25

Re: energiesparplan unter vista ändern

  Alt 8. Mär 2009, 14:31
Gude,

ich bin etwas weitergekommen, stehe nun aber wieder vor ner Wand... Mein altes Problem konnte ich beheben, indem ich einen Zeiger auf die Speicheradresse der TGUID im Funktionsaufruf verwendet habe.

Ich lade folgende Funktionen:
Delphi-Quellcode:
{$EXTERNALSYM PowerSetActiveScheme}
function PowerSetActiveScheme(UserRootPowerKey: HKEY; const SchemeGUID: PGUID):
  DWORD; stdcall; external PWR_PROF;
{$EXTERNALSYM PowerEnumerate}
function PowerEnumerate(UserRootPowerKey: HKEY; const SchemeGuid: PGUID;
  const SubGroupOfPowerSettingGuid: PGUID; AccessFlag: POWER_DATA_ACCESSOR;
  Index: ULONG; Buffer: PUCHAR; BufferSize: PDWORD):
  DWORD; stdcall; external PWR_PROF;
{$EXTERNALSYM PowerGetActiveScheme}
function PowerGetActiveScheme(UserRootPowerKey: HKEY; Buffer: PGUID): DWORD;
  stdcall; external PWR_PROF;
{$EXTERNALSYM PowerReadDescription}
function PowerReadDescription(UserRootPowerKey: HKEY; const SchemeGuid: PGUID;
  const SubGroupOfPowerSettingGuid: PGUID; const PowerSettingGuid: PGUID;
  Buffer: PUCHAR; BufferSize: PDWORD):
  DWORD; stdcall; external PWR_PROF;
{$EXTERNALSYM PowerReadDescription}
function PowerReadFriendlyName(RootPowerKey: HKEY; const SchemeGuid: PGUID;
  const SubGroupOfPowerSettingGuid: PGUID; const PowerSettingGuid: PGUID;
  Buffer: PUCHAR; BufferSize: PDWORD):
  DWORD; stdcall; external PWR_PROF;
In der Listbox lb1 werden die Strings zu den EnergieschemaGUIDS eingetragen. Per Klick auf Button3 wird das markierte Schema ausgewählt (PowerSetActiveScheme) und das funktioniert auch. Ich würde allerdings gern Informationen zu den jeweiligen Schemata erhalten. Die auskommentierten Zeilen mit den Aufrufen von PowerReadDescription und PowerReadFriendlyName liefern als Ergebnis nicht ERROR_SUCCESS. Mache ich irgendwas falsch oder verwende ich die falschen Funktionen? Zusätzlich möchte ich Einstellungen so abändern können, dass der Monitor nicht abgeschaltet wird und der Rechner nicht in den Standby verfällt. Hat sowas schon mal jemand von Euch gemacht?

MfG

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var res, size: DWORD;
    tmp: TGUID;

    function getSel:integer;
    var i : integer;
    begin
      result := 0;
      for i := 0 to lb1.Items.Count-1 do
        if(lb1.Selected[i]) then begin
          result := i;
          break;
        end;
    end;

begin
  size := SizeOf(TGUID);
  active_guid := StringToGuid(lb1.Items[getSel()]);
  //res := PowerReadDescription(0, @active_guid, @NO_SUBGROUP_GUID, nil, @tmp, @size);
  //res := PowerReadFriendlyName(0, @active_guid, nil, nil, @tmp, @size);
  res := PowerSetActiveScheme(0, @active_guid);
  // @active_guid ist ein zeiger auf die speicheradresse von active_guid.
  if res = ERROR_SUCCESS then
    lb1.Items.Add('->'+GUIDToString(active_guid))
  else
    lb1.Items.Add('Fehler -> '+GUIDToString(tmp));
end;
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#26

Re: energiesparplan unter vista ändern

  Alt 8. Mär 2009, 22:58
So wie ich das sehe ist tmp bei dir vom Typ TGUID. Man benötigt aber einen Buffer der UChar aufnimmt.
Was die Veränderungen angeht: Ein Blick in das MSDN könnte dich da weiter bringen (MSDN-Library durchsuchenPower Scheme Management).
Jan
  Mit Zitat antworten Zitat
jDallmeyer

Registriert seit: 29. Nov 2005
34 Beiträge
 
#27

Re: energiesparplan unter vista ändern

  Alt 9. Mär 2009, 10:21
Danke für die Antwort.

Ich habe versucht, den im MSDN vorgeschriebenen Datentyp UCHAR zu verwenden, doch es entstehen dann immer AccessViolations. Ich habe daher auch andere Typen getestet, doch der einzige, der keinen Fehler produziert, ist TGUID. In einer TGUID kann aber nicht die gesuchte Information stehen. Ich habe eine Weile das Netz durchsucht, um herauszufinden, wie ich mit UCHAR umzugehen habe. Meine Frage hierzu: UCHAR ist ein vorzeichenloses 8-Bit Integer. Daraus sollte sich sehr leicht ein Buchstabe ableiten lassen. Aber dann doch nur EIN Buchstabe, denn ein EIN UCHAR sollte auch nur Platz für EINEN Buchstaben sein. Die verwendete Funktion sollte aber einen String liefern, der aus mehreren Buchstaben besteht. Ich habe daher auch versucht, ein Array von UCHARS zu verwenden, bei dem die Größe des Arrays identisch zur Rückgabegröße der Funktion ist.

Bitte schau nochmal drüber. Die gezeigte Prozedur verabschiedet sich mit einer AccessViolation. Verwende ich anstelle von UCHAR TGUID, bekomme ich zwar keinen Fehler, dafür aber nichts wirklich brauchbares.

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var res, size: DWORD;
    tmp,tmp2: UCHAR; //TGUID

    function getSel:integer; [...]
begin
  size := 0;
  active_guid := StringToGuid(lb1.Items[getSel()]);
  res := PowerReadFriendlyName(0, @active_guid, nil, nil, @tmp, @size);

  if res = ERROR_MORE_DATA then // Nach dem ersten Aufruf wird size richtig gesetzt.
    res := PowerReadFriendlyName(0, @active_guid, nil, nil, @tmp2, @size)
  else showmessage('Fehler');

  if res = ERROR_SUCCESS then begin
    lb1.Items.Add(inttostr(size));
// lb1.Items.Add(GUIDToString(tmp2));
  end
  else
    lb1.Items.Add('Fehler -> '+inttostr(size));
end;
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

Registriert seit: 2. Sep 2004
Ort: Duisburg
468 Beiträge
 
Delphi 2006 Professional
 
#28

Re: energiesparplan unter vista ändern

  Alt 9. Mär 2009, 17:27
Ich kann dein Problem nachvollziehen... habe mich zu Beginn auch gewundert aber UCHAR ist etwas missverständlich verwendet. Letztendlich kommt ein Unicode String raus. Ich hab das ganze dann einfach mit PWideChar gemacht. Hier mein Code:
Delphi-Quellcode:
var b: PWideChar;
    s: DWORD;
    tmp: TGUID;
{...}
PowerReadFriendlyName(0, @tmp, nil, nil, nil, @s);
GetMem(b, s);
PowerReadFriendlyName(0, @tmp, nil, nil, Pointer(b), @s);
Memo.Lines.Add('Friendly Name --> '+ b);
FreeMem(b);
{...}
Der erste Aufruf dient dabei nur dazu die benötigte Buffergröße zu ermitteln. Ich hoffe der Code ist soweit korrekt (bei mir hat es funktioniert).
Jan
  Mit Zitat antworten Zitat
jDallmeyer

Registriert seit: 29. Nov 2005
34 Beiträge
 
#29

Re: energiesparplan unter vista ändern

  Alt 9. Mär 2009, 21:12
Hallo,

vielen Dank! Das war genau, worauf ich nicht kam

Ich habe mein Progrämmchen noch etwas erweitert, sodass nun die Energieschemata ausgelesen werden, die Namen und Beschreibungen werden angezeigt (wenn man den entsprechenden Eintrag in der Listbox markiert). Das derzeit aktive Schema kann ausgelesen und angezeigt werden. Man kann auch ein Schema in der Listbox markieren und dieses als aktiv setzen.

Ich lade das Projekt als Anhang hoch. Ich hoffe, dass es nochmal jemandem helfen kann.

Vielen Dank!

MfG



PS
ja..der code ist noch nicht sauber, aber es kam mir jetzt erstmal nur auf funktionalität an
Angehängte Dateien
Dateityp: zip energieschemabehandlungvista_362.zip (33,1 KB, 40x aufgerufen)
  Mit Zitat antworten Zitat
Admirandis
(Gast)

n/a Beiträge
 
#30

Re: energiesparplan unter vista ändern

  Alt 16. Apr 2009, 08:04
wow, hier hat sich ja einiges getan, seit ich das letzte mal da war oO

Hab aber keine Mail bekommen für eine Antwort. Sonst hätte ich schon sehr viel früher vorbeigeschaut

Auf jeden Fall vielen Dank für das Projekt an jDallmeyer.

Grüße Admirandis

EDIT:
@Sherlock: Nein, ich will mir kein zusätzliches Programm installieren, sondern in meines integrieren. Hab bei mir ein Prog im Hintergrund laufen, wo ich eigene Hotkeys verwalte. Da kommt das einfach mit rein
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 11:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf