Entwickler-Ecke

Windows API - StandBy-Modus


Eugen - So 21.07.02 21:41
Titel: StandBy-Modus
:?: Wie "versetze" ich den Rechner in StandBy unter Win98?


OregonGhost - So 21.07.02 22:00

Microsoft hat folgendes geschrieben:

SetSuspendState
The SetSuspendState function suspends the system by shutting power down. Depending on the Hibernate parameter, the system either enters a suspend (sleep) state or hibernation (S4).


Quelltext
1:
function SetSuspendState( Hibernate, ForceCritical, DisableWakeEvent: Boolean): Boolean; stdcall;                    

Alles klar oder was?
Am besten, du setzt für Hibernate false, und für ForceCritical true, und für DisableWakeEvent false.


Eugen - Di 23.07.02 17:26
Titel: Frage
:D Danke für die StandBy Funktion. Aber ich weiss nicht, welche Bibliotheken ich einbinden muss, damit die Funktion lauffähig wird. Oder muss ich einen Verweis auf kernel.dll machen oder so was?


OregonGhost - Mi 24.07.02 10:13

Also, in C muss man Powrprof.h und Powrprof.lib einbinden...

Probier's doch mal mit

Quelltext
1:
function SetSuspendState( Hibernate, ForceCritical, DisableWakeEvent: Boolean): Boolean; stdcall; external 'powrprof.dll';                    


Ach ja, sollte das nicht funktionieren, solltest du statt Boolean Integer angeben, weil in Win32 BOOL als int definiert ist.


Eugen - Do 25.07.02 22:08

Die Funktion SetSuspendState existiert tatsächlich in powrprof.dll. Ich hab auch verschiedene Variationen ausprobiert, aber der Computer reagiert in keiner Weise drauf. Vielleicht fehlt da ein Parameter? Ich hab auch den Integer-Fall getestet, aber es gibt keine Reaktion auf 0 oder 1. Möglicherweise sind andere Zahlen erwartet :?:
Gruss Eugen.


hitstec - Do 25.07.02 23:39

Versuchs mal damit. Den Codeschnippsel habe ich in Google-Groups gefunden. Habe aber keine Zeit mich damit auseinanderzusetzen.

Falls du die Lösung hast, dann poste sie doch bitte hier rein.

Auf den ersten Blick: LinkAPI ist dazu da, um eine Funktion dynamisch aus einer DLL zu laden. SetSuspendState hat drei Bool-Parameter und gibt eine Bool-Variable zurück.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
Var
  _SetSuspendState:
     Function( Hibernate, ForceCritical, DisableWakeEvent: BOOL ): BOOL
     stdcall = nil;

Function LinkAPI( const module, functionname: String ): Pointer;
  forward;

// You would export this function from a unit
Function SetSuspendState( Hibernate, ForceCritical,
  DisableWakeEvent: Boolean ): Boolean;
Begin
  If not Assigned( _SetSuspendState ) Then
    @_SetSuspendState :=
      LinkAPI( 'POWRPROF.dll', 'SetSuspendState' );
  If Assigned( _SetSuspendState ) Then
    Result := _SetSuspendState( Hibernate, ForceCritical,
                 DisableWakeEvent )
  Else
    Result := False;
End;

Function LinkAPI( const module, functionname: String ): Pointer;
Var
  hLib: HMODULE;
Begin
  hLib := GetModulehandle( Pchar( module ));
  If hLib = 0 Then
    hLib := LoadLibrary( Pchar( module ));
  If hLib <> 0 Then
    Result := getProcAddress( hLib, PChar( functionname ))
  Else
    Result := nil;
End;


Danke.


SpeedyGTD - So 28.07.02 12:15

Ich hab mir vor ein paar Tagen bei [url]http://www.Torry.net[/url] die ABF Komponenten Runtergeladen, da gibt es die Komponente abfShutdown damit geht das ganz einfach.


Eugen - Mo 29.07.02 23:41

Hi, folks. Danke für eure umfangreiche Hilfe bei der Lösung dieser Frage. Mein Rechner aber will auf SetSuspendState nicht reagieren. Womöglich liegt's daran, dass ein "Herunterfahren"- Update von Windows, das ich vor etwa 6 Monaten gemacht hat, diese Funktion ausser Gefecht gesetzt hat. Danach ist auch die StandBy-funktion verschwunden. Deswegen wollte ich wissen wie sich so was in Delphi bewerkstelligen lässt. Das war also die (traurige :-)) Vorgeschichte.
Jetzt zum Code. Die Vorschläge von OregonGhost und hitstec werden einwandfrei compiliert. Es passiert dennoch gar nichts. Ich lasse die Anwendung von meinen Freunden testen, die noch über StandBy verfügen. Dann verschaffe ich die Klarheit, ob der Code nicht stimmt oder Windows rumspinnt. bis dann. Eugen.
Ich hab gerade die von SpeedyGTD erwähnte Componente heruntergeladen. Delphi mekert beim Compilieren. Ich muss die noch checken.


SpeedyGTD - Di 30.07.02 00:22

Also bei mir funktionieren die einwandfrei, wo hast du sie denn hinkopiert?
Ich hab aber auch Windows XP vieleicht ist es dafür optimiert. Ich hab die komponenten direkt in den Delphi Ordner kopiert.


Basti - Fr 29.10.04 16:53

Also ich habe StandBy mal hiermit versucht:

Delphi-Quelltext
1:
SetSystemPowerState(true, false);                    

Ging aber leider nicht.
Jetzt habe ich diesen Beitrag hier gefunden und will
SetSuspendState verwenden.
Allerdings meckert er mir, dass er den Befehl nicht kennt.
Welche Unit muss ich da einbinden? :roll:


Sprint - Fr 29.10.04 17:27

Laut MS Platform SDK wird SetSuspendState nicht von Windows 95 und Windows NT unterstützt.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
function SetSuspendState(Hibernate, ForceCritical, DisableWakeEvent: Boolean): Boolean;
var
 _SetSuspendState: function(Hibernate, ForceCritical, DisableWakeEvent: BOOL): BOOL; stdcall;
 LibMod: HMODULE;
begin

  Result := False;
  LibMod := LoadLibrary('POWRPROF.DLL');

  if LibMod <> 0 then
  begin
    _SetSuspendState := GetProcAddress(LibMod, 'SetSuspendState');
    if Assigned(_SetSuspendState) then
      Result := _SetSuspendState(Hibernate, ForceCritical, DisableWakeEvent);
    FreeLibrary(LibMod);
  end;

end;



Edit: Hatte FreeLibrary vergessen. :(


Basti - Fr 29.10.04 17:56

Und wie bekomme ich einen Rechner mit XP nun in den StandBy Modus?


Sprint - Fr 29.10.04 18:17

Basti hat folgendes geschrieben:
Und wie bekomme ich einen Rechner mit XP nun in den StandBy Modus?

Indem du mal auf [url]http//msdn.microsoft.com[/url] gehst und dir die Seiten zu den WinAPI Funktionen Suche im MSDN SETSUSPENDSTATE, Suche im MSDN SETSYSTEMPOWERSTATE, Suche im MSDN EXITWINDOWSEX, Suche im MSDN INITIATESYSTEMSHUTDOWN und Suche im MSDN INITIATESYSTEMSHUTDOWNEX durch ließt.


Basti - Fr 29.10.04 18:37

Hmm - also SetSuspendState und WxitWindowsEx kannte ich schon,
die anderen kenne ich jetzt.
Dumm ist bloß, dass man immer Herunterfahren, Neustarten und Abmelden liest,
aber nie StandBy, was ich ja eigentlich will. :(


Sprint - Fr 29.10.04 18:41

Basti hat folgendes geschrieben:
Hmm - also SetSuspendState und WxitWindowsEx kannte ich schon,
die anderen kenne ich jetzt.
Dumm ist bloß, dass man immer Herunterfahren, Neustarten und Abmelden liest,
aber nie StandBy, was ich ja eigentlich will. :(

Dann rufe doch einfach mal die Funktion SetSuspendState (True, Flase, False) auf, die ich vorhin geschrieben habe und schaue an was passiert. :wink:


Basti - Fr 29.10.04 19:01

Äh - peinlich peinlich.
Ich weiß nicht welche Unit ich dafür brauch, sonst würde ich es machen :)

Edit: Ich habe WinXP - geht das da auch?
Mit dem Herunterfahren geht es da ja nicht so einfach...


Sprint - Fr 29.10.04 21:23

Basti hat folgendes geschrieben:
Äh - peinlich peinlich.
Ich weiß nicht welche Unit ich dafür brauch, sonst würde ich es machen

Kopiere doch einfach mal den Code, den ich geschrieben habe und rufe diese Funktion auf. Außer Windows.pas brauchst du wohl keine andere.

Zitat:
Ich habe WinXP - geht das da auch? Mit dem Herunterfahren geht es da ja nicht so einfach...

Ich hab' den Code heute selber geschrieben und unter Windows XP Pro getestet. Reicht dir das als Antwort.


Basti - Sa 30.10.04 11:17

[Edit] Gelöscht - Ich möchte nicht, dass ihr meine Blödheit seht [/Edit]


MrSaint - Sa 30.10.04 11:32

Basti hat folgendes geschrieben:
Kommt mir also recht fremd vor...


OregonGhost hat folgendes geschrieben:
function SetSuspendState( Hibernate, ForceCritical, DisableWakeEvent: Boolean): Boolean; stdcall; external 'powrprof.dll';




MrSaint