Re: energiesparplan unter vista ändern
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:
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:
type
PGUID = ^TGUID; TGUID = packed record D1: Integer; D2: Word; D3: Word; D4: array[0..7] of Byte; end;
Delphi-Quellcode:
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?
powercfg /SETACTIVE 2
gruß, igschliff |
Re: energiesparplan unter vista ändern
nach 'nem kurzen Blick in PowerSetActiveScheme, bzw. die von da verlinkten Seiten,
würd ich mal vermuten du mußt dir über EnumPwrSchemes/PowerEnumerate (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 :gruebel: , falls der Index mit 1 beginnt) |
Re: energiesparplan unter vista ändern
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:
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 :)
ShellExecute(0,
Nil, PChar('powercfg'), Pchar('-SETACTIVE '+EnergieSchemaFromID(schema)), NIL, SW_HIDE); |
Re: energiesparplan unter vista ändern
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:
Wenn man den Teil nun hat ist der Rest ganz einfach. Die Power-Schemes könnte man zum Bleistift nun so auflisten:
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;
Delphi-Quellcode:
Um mich selber zu zitieren:
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; Zitat:
Gruß Mr_G P.S.: Vielleicht wäre das hier und dieses auch was für die CodeLib :gruebel: |
Re: energiesparplan unter vista ändern
wow, vielen dank! das werd ich auf jeden fall noch ausprobieren. :-)
|
Re: energiesparplan unter vista ändern
hi,
ich hab das jetzt mal ausprobiert, bekomme aber leider die fehlermeldung
Delphi-Quellcode:
der komplette quelltext ist
Der Prozedureinsprungpunkt "PowerEnumerate" wurde in der DLL "PowrProf.dll" nicht gefunden.
Delphi-Quellcode:
habe ich noch irgendwas verdreht?
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. gruß, igschliff |
Re: energiesparplan unter vista ändern
Sollte da kein Vertipper drin sein sollte es eigentlich gehen... du hast doch auch Windows Vista, oder?
|
Re: energiesparplan unter vista ändern
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 |
Re: energiesparplan unter vista ändern
Zitat:
Zitat:
==> Betriebssystemweiche ;) Zitat:
Aus dem C++ Header mit Rückgabetyp Name(Typ Name, Typ Name);
Code:
wird eben
BOOLEAN EnumPwrSchemes(
PWRSCHEMESENUMPROC lpfnPwrSchemesEnumProc, LPARAM lParam ); 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. |
Re: energiesparplan unter vista ändern
Da ich das ganze auch mal für XP gemacht habe will ich das nun nicht verheimlichen ;)
Delphi-Quellcode:
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...)
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; Was das Aufzählen angeht: Das funktioniert hier mit einem Callback. Das Beispiel mit dem Memo würde dann etwa so aussehen:
Delphi-Quellcode:
Hoffe das funktioniert und ist auch richtig... Viel Spaß damit :)
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02: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