AGB  ·  Datenschutz  ·  Impressum  







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

energiesparplan unter vista ändern

Ein Thema von Admirandis · begonnen am 12. Okt 2008 · letzter Beitrag vom 19. Jun 2009
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    
igschliff

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

Re: energiesparplan unter vista ändern

  Alt 12. Jan 2009, 15:55
ich verstehe das jetzt so, dass ich über die PGUID (ist ein datentyp, den es gibt) definieren sollte, was ich der funktion übergeben will. PGUID hat nach delphi-hilfe folgendes format:
Delphi-Quellcode:
      type
     PGUID = ^TGUID;
     TGUID = packed record
       D1: Integer;
       D2: Word;
       D3: Word;
       D4: array[0..7] of Byte;
      end;
ich habe im netz gesucht, jedoch nicht herausbekommen können, wie ich hiermit nun mein gewünschtes energieschema definieren kann. mit dem progrämmchen powercfg ist das ganz einfach. wenn ich beispielsweise energieschema 2 haben möchte tippe ich in der konsole:
powercfg /SETACTIVE 2 ich dachte, dass das über die API ähnlich einfach sein sollte. oder bin ich einfach völlig auf dem holzweg und verstehe schlicht nicht richtig, was es mit PGUID auf sich hat?

gruß,
igschliff
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.131 Beiträge
 
Delphi 12 Athens
 
#12

Re: energiesparplan unter vista ändern

  Alt 12. Jan 2009, 16:06
nach 'nem kurzen Blick in MSDN-Library durchsuchenPowerSetActiveScheme, bzw. die von da verlinkten Seiten,
würd ich mal vermuten du mußt dir über MSDN-Library durchsuchenEnumPwrSchemes/MSDN-Library durchsuchenPowerEnumerate (Enumerates all power schemes) die vorhndenen Schemata auflisten, dir das gewünschte Schema bzw. dessen GUID auswählen und diese an PowerSetActiveScheme übergeben.

powercfg /SETACTIVE 2 würde dann dem entsprechen, wenn du die dritte, erhaltene GUID verwendest
(oder die zweite GUID , falls der Index mit 1 beginnt)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
igschliff

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

Re: energiesparplan unter vista ändern

  Alt 12. Jan 2009, 17:38
hi,

danke für die hilfe.
mir ist die einbindung von dlls aber noch zu suspekt, sodass ich bei jedem weiteren schritt noch verwirrter werde. ich habe mein problem jetzt simpel und unelegant gelöst:
Delphi-Quellcode:
ShellExecute(0,
        Nil,
        PChar('powercfg'),
        Pchar('-SETACTIVE '+EnergieSchemaFromID(schema)),
        NIL,
        SW_HIDE);
wobei EnergieSchemaFromID eine funktion ist, die eine id erhält und in der registry nach dem namen des dazugehörigen schemas sucht. es scheint zu funktionieren
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

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

Re: energiesparplan unter vista ändern

  Alt 12. Jan 2009, 18:19
Dabei ist das gar nicht soo kompliziert. Man muss das ganze nur einmal übersetzen. Ich hoffe ich hab das so richtig gemacht (funktioniert zumindest):
Delphi-Quellcode:
const PWR_PROF = 'PowrProf.dll';

{$EXTERNALSYM _POWER_DATA_ACCESSOR}
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;

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}';

{$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;
Wenn man den Teil nun hat ist der Rest ganz einfach. Die Power-Schemes könnte man zum Bleistift nun so auflisten:
Delphi-Quellcode:
procedure TEinForm.ButtonClick(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
      Memo.Lines.Add(GUIDToString(tmp));
    Inc(i);
  until res <> ERROR_SUCCESS;
end;
Um mich selber zu zitieren:
Zitat von Mr_G:
Falls du das Programm selber schreiben willst sollten folgende Funktionen für dich interessant sein:
PowerSetActiveScheme
PowerEnumerate
Gruß

Mr_G
Dort steht eigentlich alles Relavante zur Anwendung.
Gruß

Mr_G

P.S.: Vielleicht wäre das hier und dieses auch was für die CodeLib
Jan
  Mit Zitat antworten Zitat
igschliff

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

Re: energiesparplan unter vista ändern

  Alt 12. Jan 2009, 19:59
wow, vielen dank! das werd ich auf jeden fall noch ausprobieren.
  Mit Zitat antworten Zitat
igschliff

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

Re: energiesparplan unter vista ändern

  Alt 15. Jan 2009, 15:44
hi,

ich hab das jetzt mal ausprobiert, bekomme aber leider die fehlermeldung
Der Prozedureinsprungpunkt "PowerEnumerate" wurde in der DLL "PowrProf.dll" nicht gefunden. der komplette quelltext ist
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,
  ACCESS_DC_POWER_SETTING_INDEX,
  ACCESS_SCHEME,
  ACCESS_SUBGROUP,
  ACCESS_INDIVIDUAL_SETTING,
  ACCESS_ACTIVE_SCHEME,
  ACCESS_CREATE_SCHEME
  );
{$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;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  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;

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
      Memo.Lines.Add(GUIDToString(tmp));
    Inc(i);
  until res <> ERROR_SUCCESS;
end;

end.
habe ich noch irgendwas verdreht?

gruß,
igschliff
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

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

Re: energiesparplan unter vista ändern

  Alt 15. Jan 2009, 21:31
Sollte da kein Vertipper drin sein sollte es eigentlich gehen... du hast doch auch Windows Vista, oder?
Jan
  Mit Zitat antworten Zitat
igschliff

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

Re: energiesparplan unter vista ändern

  Alt 15. Jan 2009, 21:48
nee, XP...hmm, jetzt lese ich es auch im msdn...

ich müsste es dann also mit EnumPwrSchemes und SetActivePwrScheme zusammenbasteln. hierzu zwei fragen:

1. würde das dann auch "aufwärtskompatibel" zu vista sein?
2. wo bekommt man die informationen her, wie man die transformation MSDN->DELPHI hinbekommt? ich bin beeindruckt, wenn ich die quelltexte hier sehe, aber ich komme nicht nur mit msdn auf eine übersetzung.

gruß,
igschliff
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#19

Re: energiesparplan unter vista ändern

  Alt 15. Jan 2009, 21:55
Zitat von igschliff:
1. würde das dann auch "aufwärtskompatibel" zu vista sein?
Ich zitiere mal:
Zitat:
[EnumPwrSchemes is available for use in the operating systems listed in the Requirements section. It may be altered or unavailable in subsequent versions. Applications written for Windows Vista and later should use PowerEnumerate instead.]
Client Requires Windows Vista, Windows XP, or Windows 2000 Professional.
Geht also, ist aber nicht empfohlen.

==> Betriebssystemweiche

Zitat:
2. wo bekommt man die informationen her, wie man die transformation MSDN->DELPHI hinbekommt? ich bin beeindruckt, wenn ich die quelltexte hier sehe, aber ich komme nicht nur mit msdn auf eine übersetzung.
Also die Funktionsaufrufe alssen sich recht einfach übersetzten. (Wenns mit recors und unions zugeht kanns noch komplizierter werden, aber sonst ...)

Aus dem C++ Header mit

Rückgabetyp Name(Typ Name, Typ Name);

Code:
BOOLEAN EnumPwrSchemes(
PWRSCHEMESENUMPROC lpfnPwrSchemesEnumProc,
LPARAM lParam
);
wird eben

function Name(Name: Typ, Name:Typ); external '...'; stdcall;

Das stdcall muss da rein, weil du C++ Funktionen aufrufst. Das external gibt die dll an in welcher die Funktion steht.
  Mit Zitat antworten Zitat
Benutzerbild von Mr_G
Mr_G

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

Re: energiesparplan unter vista ändern

  Alt 16. Jan 2009, 13:55
Da ich das ganze auch mal für XP gemacht habe will ich das nun nicht verheimlichen
Delphi-Quellcode:
type
  WRSCHEMESENUMPROC = function(uiIndex: UINT; dwName: DWORD; sName: PWideChar;
    dwDesc: DWORD; sDesc: PWideChar; pp: Pointer; lParam: LPARAM): BOOLEAN; stdcall;
  {$EXTERNALSYM PWRSCHEMESENUMPROC}
  PWRSCHEMESENUMPROC = ^WRSCHEMESENUMPROC;


{$EXTERNALSYM SetActivePwrScheme}
function SetActivePwrScheme(uiID: UINT; lpGlobalPowerPolicy: Pointer;
  lpPowerPolicy: Pointer): BOOL; stdcall; external PWR_PROF;
{$EXTERNALSYM EnumPwrSchemes}
function EnumPwrSchemes(lpfnPwrSchemesEnumProc: PWRSCHEMESENUMPROC;
  lParam: LPARAM): BOOL; stdcall; external PWR_PROF;
Bei SetActivePwrScheme werden eigentlich Zeiger auf eine GLOBAL_POWER_POLICY bzw. eine POWER_POLICY übergeben... hab ich aber mal weggelassen. (Kann bei Bedarf nachgereicht werden...)
Was das Aufzählen angeht: Das funktioniert hier mit einem Callback. Das Beispiel mit dem Memo würde dann etwa so aussehen:
Delphi-Quellcode:
function XPEnumSchemes(uiIndex: UINT; dwName: DWORD; sName: PWideChar;
  dwDesc: DWORD; sDesc: PWideChar; pp: Pointer; lParam: LPARAM): BOOLEAN; stdcall;
begin
  Form.Memo.Lines.Add(IntToStr(uiIndex) +' '+ sName +' --> '+ sDesc);
  Result := True;
end;

procedure TForm1.ButtonClick(Sender: TObject);
var clb: WRSCHEMESENUMPROC;
begin
  clb := XPEnumSchemes;
  EnumPwrSchemes(@clb, 0);
end;
Hoffe das funktioniert und ist auch richtig... Viel Spaß damit
Jan
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    


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 20:17 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