AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Standby zurück wird nicht erkannt?
Thema durchsuchen
Ansicht
Themen-Optionen

Standby zurück wird nicht erkannt?

Ein Thema von schwa226 · begonnen am 15. Jun 2009 · letzter Beitrag vom 16. Jan 2010
Antwort Antwort
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#1

Standby zurück wird nicht erkannt?

  Alt 15. Jun 2009, 20:10
Hi,

ich habe hier ein Problem mit diesem Code:
Ausführung für 2000, XP, Vista & wahrscheinlich neuer

Und zwar geht der Code wenn ich per Start->Standby in den Standby fahre und per Power-Schalter wieder zurück komme.

Jedoch habe ich eine andere Software, die das Automatisch erledigt.
Das der PC in den Standby fährt bekomme ich noch mit. Jedoch bekomme ich kein Resume wenn er wieder hochfährt.

Erst wenn ich die Mouse bewege (einfach nur berühre) bekomme ich die Meldung. Da kann es aber sein, dass der PC schon ein paar Minuten läuft.

Wie kann ich hier das Problem finden? Scheint ja eigentlich nicht Delphi abhängig zu sein sondern Windows.

Benutze Windows XP SP3 & Delphi 2009.
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Standby zurück wird nicht erkannt?

  Alt 15. Jun 2009, 20:13
Wäre gut zu wissen, was für eine Software du nutzt?
In deinem verlinkten Code wird nur auf eine Message reagiert. Diese scheint durch die Verwendung deiner Software nicht mehr gesendet zu werden.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#3

Re: Standby zurück wird nicht erkannt?

  Alt 17. Jun 2009, 10:39
Es ist die DVB Software DVBViewer in Verwendung des Recording Services und dem Taskscheduler.
Der Taskscheduler kümmert sich darum das DVBViewer wieder nach dem Standby gestartet wird.
Das Aufwecken übernimmt aber der Recording Service (Windows Service).

Vorher hatte ich den DVBViewer nur mit dem Taskscheduler verwendet.
Da hat es noch funktioniert.

Eben das komische ist, in dem Moment wo ich die Mouse berühre bekomme ich die Meldung. Nun weis ich aber nicht weiter wo ich hier das Problem finden kann. Meine Software kriegt ja zwischen Aufwachen und Mouse bewegung nichts mit und schreibt natürlich deswegen auch nichts ins LOG-File.
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Standby zurück wird nicht erkannt?

  Alt 17. Jun 2009, 12:41
Mal im Forum der Software nachgefragt bzw. gwsucht? Will mich da nicht anmelden nur um suchen zu können.
Edit:
Zitat von [url=http://de.dvbviewer.tv/wiki/DVB_Task_Scheduler:
Klick mich[/url]]
[frmScheduler]

RestartAutomatic=1

sorgt dafür, dass nach einem Ruhemodus/Standby der DVBViewer ohne Benutzung von Tastatur oder Maus gestartet wird, insofern die Option "Restart On Resume" einen Wert größer 0 Sekunden erhält. Ein Nachteil ist, sollte der PC zum Beispiel durch Schmutz unter einer optischen Maus versehentlich aus dem Standby aufwachen, wird auch dann der DVBViewer gestartet, was eine automatische Rückkehr in den Standby verhindert. Diese Option ist standardmäßig aktiviert. Um sie zu deaktivieren muss RestartAutomatic auf 0 gesetzt werden.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#5

Re: Standby zurück wird nicht erkannt?

  Alt 30. Okt 2009, 18:34
Hallo,

jetzt muss ich diesen alten Post nocheinmal rauskramen.

Nun habe ich festgestellt das ich Probleme habe mit erkennen ob der PC in den Standby geht.

Ich habe ein externes Testprogramm, da geht es:
Zitat:
19:03:44 Running on:
19:03:44 Windows 7 Ultimate Edition x86 Version: 6.1.7600

19:03:44 for further details look: http://msdn.microsoft.com/en-us/library/aa373247(VS.85).aspx

19:10:40 Msg: WM_POWERBROADCAST
19:10:40 WParam: PBT_APMSUSPEND, Info: System is suspending operation.

19:11:53 Msg: WM_POWERBROADCAST
19:11:53 WParam: PBT_APMRESUMEAUTOMATIC, Info: Operation is resuming automatically from a low-power state. This message is sent every time the system resumes.

19:11:53 Msg: WM_POWERBROADCAST
19:11:53 WParam: PBT_APMRESUMESUSPEND, Info: Operation is resuming from a low-power state. This message is sent after PBT_APMRESUMEAUTOMATIC if the resume is triggered by user input, such as pressing a key.
Der Code ist hier aus dem Board.

Nun habe ich ein DLL-Plugin das auch auf die Power Message reagieren soll.
Also habe ich der DLL eine Form hinzugefügt um auf die WM_POWERBROADCAST reagieren zu können:
Zitat:
19:11:56 Msg: WM_POWERBROADCAST
19:11:56 WParam: PBT_APMRESUMEAUTOMATIC, Info: Operation is resuming automatically from a low-power state. This message is sent every time the system resumes.

19:11:56 Msg: WM_POWERBROADCAST
19:11:56 WParam: PBT_APMRESUMESUSPEND, Info: Operation is resuming from a low-power state. This message is sent after PBT_APMRESUMEAUTOMATIC if the resume is triggered by user input, such as pressing a key.
Hier fehlt die Meldung PBT_APMSUSPEND??

Beide Codes laufen zur selben Zeit auf dem selben System - trotzdem erkennt meine DLL nicht das der PC in den Ruhezustand geht?

Hier der Code von der Form in der DLL:
Delphi-Quellcode:
unit PowerWatch;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, INIFiles, StdCtrls;

type
  TFormPowerWatch = class(TForm)
    Memo1: TMemo;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure WMPowerBroadcast(var MyMessage: TMessage); message WM_POWERBROADCAST;
  end;

var
  FormPowerWatch: TFormPowerWatch;

const
  PBT_APMQUERYSUSPEND = $0000;
  PBT_APMQUERYSTANDBY = $0001;

  PBT_APMQUERYSUSPENDFAILED = $0002;
  PBT_APMQUERYSTANDBYFAILED = $0003;

  PBT_APMSUSPEND = $0004;
  PBT_APMSTANDBY = $0005;

  PBT_APMRESUMECRITICAL = $0006;
  PBT_APMRESUMESUSPEND = $0007;
  PBT_APMRESUMESTANDBY = $0008;

  PBTF_APMRESUMEFROMFAILURE = $00000001;

  PBT_APMBATTERYLOW = $0009;
  PBT_APMPOWERSTATUSCHANGE = $000A;
  PBT_POWERSETTINGCHANGE = $8013;

  PBT_APMOEMEVENT = $000B;
  PBT_APMRESUMEAUTOMATIC = $0012;


implementation

{$R *.dfm}

function TranslatePowerBroadcast(const Msg: Cardinal): string;
begin
  case Msg of
    WM_POWERBROADCAST: Result := 'WM_POWERBROADCAST';

    PBT_APMQUERYSUSPEND: Result := 'PBT_APMQUERYSUSPEND, Info: Request for permission to suspend. In Windows Server 2008 and Windows Vista, use the SetThreadExecutionState function instead.';
    PBT_APMQUERYSTANDBY: Result := 'PBT_APMQUERYSTANDBY';

    PBT_APMQUERYSUSPENDFAILED: Result := 'PBT_APMQUERYSUSPENDFAILED';
    PBT_APMQUERYSTANDBYFAILED: Result := 'PBT_APMQUERYSTANDBYFAILE, Info: Suspension request denied. In Windows Server 2008 and Windows Vista, use SetThreadExecutionState instead.D';

    PBT_APMSUSPEND: Result := 'PBT_APMSUSPEND, Info: System is suspending operation.';
    PBT_APMSTANDBY: Result := 'PBT_APMSTANDBY';

    PBT_APMRESUMECRITICAL: Result := 'PBT_APMRESUMECRITICAL, Info: Operation resuming after critical suspension. In Windows Server 2008 and Windows Vista, use PBT_APMRESUMEAUTOMATIC instead.';
    PBT_APMRESUMESUSPEND: Result := 'PBT_APMRESUMESUSPEND, Info: Operation is resuming from a low-power state. This message is sent after PBT_APMRESUMEAUTOMATIC if the resume is triggered by user input, such as pressing a key.';
    PBT_APMRESUMESTANDBY: Result := 'PBT_APMRESUMESTANDBY';

    //PBTF_APMRESUMEFROMFAILURE: Result := 'PBTF_APMRESUMEFROMFAILURE';

    PBT_APMBATTERYLOW: Result := 'PBT_APMBATTERYLOW, Info: Battery power is low. In Windows Server 2008 and Windows Vista, use PBT_APMPOWERSTATUSCHANGE instead.';
    PBT_APMPOWERSTATUSCHANGE: Result := 'PBT_APMPOWERSTATUSCHANGE, Info: Power status has changed.';
    //PBT_POWERSETTINGCHANGE: Result := 'PBT_POWERSETTINGCHANGE, Info: A power setting change event has been received.';

    PBT_APMOEMEVENT: Result := 'PBT_APMOEMEVENT, Info: OEM-defined event occurred. In Windows Server 2008 and Windows Vista, this event is not available because these operating systems support only ACPI; APM BIOS events are not supported.';
    PBT_APMRESUMEAUTOMATIC: Result := 'PBT_APMRESUMEAUTOMATIC, Info: Operation is resuming automatically from a low-power state. This message is sent every time the system resumes.';
  else
    Result := 'Unknown Message "'+IntToStr(Msg)+'"';
  end;
end;

procedure TFormPowerWatch.WMPowerBroadcast(var MyMessage: TMessage);
var
  IniFile : TIniFile;
begin

case MyMessage.Msg of

   WM_POWERBROADCAST: begin
    // windows powermanagement message

    Memo1.Lines.Append(TimeToStr(now) + ' Msg: '+TranslatePowerBroadcast(MyMessage.Msg));
    Memo1.Lines.Append(TimeToStr(now) + ' WParam: '+TranslatePowerBroadcast(MyMessage.WParam));
    Memo1.Lines.Append('');

    case MyMessage.WParam of

      PBT_APMSUSPEND, PBT_APMSTANDBY,
      PBT_APMQUERYSUSPEND, PBT_APMQUERYSTANDBY: begin

        // Hier hin, was getan werden muss, bevor Windows in den Standby darf,
        // z.B. Netzwerk- oder Datenbankverbindungen trennen, Timer abstellen, etc.
        // Seit Vista hat man hier nur noch max. 2 Sekunden Zeit was zu erledigen.

        MyMessage.Result := BROADCAST_QUERY_DENY; // Standby/Ruhezustand verweigern
      end;

      PBT_APMRESUMECRITICAL, PBT_APMRESUMESUSPEND,
      PBT_APMRESUMESTANDBY, PBT_APMRESUMEAUTOMATIC: begin

        // Windows kommt aus dem Standby/Ruhezustand wieder.
        // Hier z.B. Verbindungen wiederherstellen.

        MyMessage.Result := 1; // Standby/Ruhezustand erlauben

      end;
    end;
   end;
end;

end;

end.
Und hier der Code mit dem es geht:
Delphi-Quellcode:
unit FormMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, WindowsVersionInfo;

type
  TMainForm = class(TForm)
    MemoMessageLog: TMemo;
    WindowsVersionInfo: TWindowsVersionInfo;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure WMPowerBroadcast(var MyMessage: TMessage); message WM_POWERBROADCAST;
  end;

var
  MainForm: TMainForm;

const
  PBT_APMQUERYSUSPEND = $0000;
  PBT_APMQUERYSTANDBY = $0001;

  PBT_APMQUERYSUSPENDFAILED = $0002;
  PBT_APMQUERYSTANDBYFAILED = $0003;

  PBT_APMSUSPEND = $0004;
  PBT_APMSTANDBY = $0005;

  PBT_APMRESUMECRITICAL = $0006;
  PBT_APMRESUMESUSPEND = $0007;
  PBT_APMRESUMESTANDBY = $0008;

  PBTF_APMRESUMEFROMFAILURE = $00000001;

  PBT_APMBATTERYLOW = $0009;
  PBT_APMPOWERSTATUSCHANGE = $000A;
  PBT_POWERSETTINGCHANGE = $8013;

  PBT_APMOEMEVENT = $000B;
  PBT_APMRESUMEAUTOMATIC = $0012;

implementation

{$R *.dfm}

function TranslatePowerBroadcast(const Msg: Cardinal): string;
begin
  case Msg of
    WM_POWERBROADCAST: Result := 'WM_POWERBROADCAST';

    PBT_APMQUERYSUSPEND: Result := 'PBT_APMQUERYSUSPEND, Info: Request for permission to suspend. In Windows Server 2008 and Windows Vista, use the SetThreadExecutionState function instead.';
    PBT_APMQUERYSTANDBY: Result := 'PBT_APMQUERYSTANDBY';

    PBT_APMQUERYSUSPENDFAILED: Result := 'PBT_APMQUERYSUSPENDFAILED';
    PBT_APMQUERYSTANDBYFAILED: Result := 'PBT_APMQUERYSTANDBYFAILE, Info: Suspension request denied. In Windows Server 2008 and Windows Vista, use SetThreadExecutionState instead.D';

    PBT_APMSUSPEND: Result := 'PBT_APMSUSPEND, Info: System is suspending operation.';
    PBT_APMSTANDBY: Result := 'PBT_APMSTANDBY';

    PBT_APMRESUMECRITICAL: Result := 'PBT_APMRESUMECRITICAL, Info: Operation resuming after critical suspension. In Windows Server 2008 and Windows Vista, use PBT_APMRESUMEAUTOMATIC instead.';
    PBT_APMRESUMESUSPEND: Result := 'PBT_APMRESUMESUSPEND, Info: Operation is resuming from a low-power state. This message is sent after PBT_APMRESUMEAUTOMATIC if the resume is triggered by user input, such as pressing a key.';
    PBT_APMRESUMESTANDBY: Result := 'PBT_APMRESUMESTANDBY';

    //PBTF_APMRESUMEFROMFAILURE: Result := 'PBTF_APMRESUMEFROMFAILURE';

    PBT_APMBATTERYLOW: Result := 'PBT_APMBATTERYLOW, Info: Battery power is low. In Windows Server 2008 and Windows Vista, use PBT_APMPOWERSTATUSCHANGE instead.';
    PBT_APMPOWERSTATUSCHANGE: Result := 'PBT_APMPOWERSTATUSCHANGE, Info: Power status has changed.';
    PBT_POWERSETTINGCHANGE: Result := 'PBT_POWERSETTINGCHANGE, Info: A power setting change event has been received.';

    PBT_APMOEMEVENT: Result := 'PBT_APMOEMEVENT, Info: OEM-defined event occurred. In Windows Server 2008 and Windows Vista, this event is not available because these operating systems support only ACPI; APM BIOS events are not supported.';
    PBT_APMRESUMEAUTOMATIC: Result := 'PBT_APMRESUMEAUTOMATIC, Info: Operation is resuming automatically from a low-power state. This message is sent every time the system resumes.';
  else
    Result := 'Unknown Message "'+IntToStr(Msg)+'"';
  end;
end;

procedure TMainForm.FormCreate(Sender: TObject);
var
  wvi : TWindowsVersionInfo;
begin

  wvi := TWindowsVersionInfo.Create(self);

  MemoMessageLog.Lines.Append(TimeToStr(now) + ' Running on:');
  MemoMessageLog.Lines.Append(TimeToStr(now) + ' ' + wvi.WindowsVersionsString + ' ' + wvi.ServicePack +
    ' Version: ' + IntToStr(wvi.MajorVersion) + '.' + IntToStr(wvi.MinorVersion ) + '.' + IntToStr(wvi.BuildNumber));
  MemoMessageLog.Lines.Append('');
  MemoMessageLog.Lines.Append(TimeToStr(now) + ' for further details look: http://msdn.microsoft.com/en-us/library/aa373247(VS.85).aspx');
  MemoMessageLog.Lines.Append('');
end;

procedure TMainForm.WMPowerBroadcast(var MyMessage: TMessage);
begin
  if MyMessage.Msg = WM_POWERBROADCAST then begin
    MemoMessageLog.Lines.Append(TimeToStr(now) + ' Msg: '+TranslatePowerBroadcast(MyMessage.Msg));
    MemoMessageLog.Lines.Append(TimeToStr(now) + ' WParam: '+TranslatePowerBroadcast(MyMessage.WParam));
    MemoMessageLog.Lines.Append('');
    //MemoMessageLog.Lines.SaveToFile(ExtractFileDir(Application.ExeName)+'\Message.log');

    // windows powermanagement message
    if (MyMessage.WParam = PBT_APMQUERYSUSPEND) or
       (MyMessage.WParam = PBT_APMQUERYSTANDBY)
    then begin
      // windows wants to go into standby or hibernation mode

      // Hier hin, was getan werden muss, bevor Windows in den Standby darf,
      // z.B. Netzwerk- oder Datenbankverbindungen trennen, Timer abstellen, etc.

      MyMessage.Result := 1; // allow standby/hibernation
      // MyMessage.Result := BROADCAST_QUERY_DENY; // deny standby/hibernation

    end else if (MyMessage.WParam = PBT_APMRESUMECRITICAL) or
                (MyMessage.WParam = PBT_APMRESUMESUSPEND) or
                (MyMessage.WParam = PBT_APMRESUMESTANDBY)
    then begin
      // windows returns from standby or hibernation

      // Hier z.B. Verbindungen wiederherstellen
    end;
  end;
end;

end.
Ich kann hier keinen Unterschied finden! Oder gibt es da Unterschiede wenn eine DLL mit Form verwendet wird?
Die Form wird beim laden des Plugins so erzeugt:
Delphi-Quellcode:
      if not Assigned(FormPowerWatch) then
          FormPowerWatch := TFormPowerWatch.Create(nil);
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#6

Re: Standby zurück wird nicht erkannt?

  Alt 30. Okt 2009, 21:56
Ergänzung:

Ich habe es auch noch mit folgendem Code versucht:
Delphi-Quellcode:
unit NonVCL_WM;

interface

uses
  Windows,Classes,Messages;

type
  { Our class derived from TComponent
    or another ancestor class }

  TMyClass = class(TComponent)
  private
    fHWnd: HWND;
      { field to store the window handle }
  protected
    procedure WndMethod(var Msg: TMessage); virtual;
      { window proc - called by Windows to handle
        messages passed to our hidden window }

  public
     constructor Create(AOwner: TComponent); override;
       { create hidden window here: store handle in fHWnd}
     destructor Destroy; override;
       { free hidden window here }
  end;

var
  MyMessageClass : TMyClass;

implementation

uses
  PowerWatch,SysUtils;

function TranslatePowerBroadcast(const Msg: Cardinal): string;
begin
  case Msg of
    WM_POWERBROADCAST: Result := 'WM_POWERBROADCAST';

    PBT_APMQUERYSUSPEND: Result := 'PBT_APMQUERYSUSPEND, Info: Request for permission to suspend. In Windows Server 2008 and Windows Vista, use the SetThreadExecutionState function instead.';
    PBT_APMQUERYSTANDBY: Result := 'PBT_APMQUERYSTANDBY';

    PBT_APMQUERYSUSPENDFAILED: Result := 'PBT_APMQUERYSUSPENDFAILED';
    PBT_APMQUERYSTANDBYFAILED: Result := 'PBT_APMQUERYSTANDBYFAILE, Info: Suspension request denied. In Windows Server 2008 and Windows Vista, use SetThreadExecutionState instead.D';

    PBT_APMSUSPEND: Result := 'PBT_APMSUSPEND, Info: System is suspending operation.';
    PBT_APMSTANDBY: Result := 'PBT_APMSTANDBY';

    PBT_APMRESUMECRITICAL: Result := 'PBT_APMRESUMECRITICAL, Info: Operation resuming after critical suspension. In Windows Server 2008 and Windows Vista, use PBT_APMRESUMEAUTOMATIC instead.';
    PBT_APMRESUMESUSPEND: Result := 'PBT_APMRESUMESUSPEND, Info: Operation is resuming from a low-power state. This message is sent after PBT_APMRESUMEAUTOMATIC if the resume is triggered by user input, such as pressing a key.';
    PBT_APMRESUMESTANDBY: Result := 'PBT_APMRESUMESTANDBY';

    //PBTF_APMRESUMEFROMFAILURE: Result := 'PBTF_APMRESUMEFROMFAILURE';

    PBT_APMBATTERYLOW: Result := 'PBT_APMBATTERYLOW, Info: Battery power is low. In Windows Server 2008 and Windows Vista, use PBT_APMPOWERSTATUSCHANGE instead.';
    PBT_APMPOWERSTATUSCHANGE: Result := 'PBT_APMPOWERSTATUSCHANGE, Info: Power status has changed.';
    //PBT_POWERSETTINGCHANGE: Result := 'PBT_POWERSETTINGCHANGE, Info: A power setting change event has been received.';

    PBT_APMOEMEVENT: Result := 'PBT_APMOEMEVENT, Info: OEM-defined event occurred. In Windows Server 2008 and Windows Vista, this event is not available because these operating systems support only ACPI; APM BIOS events are not supported.';
    PBT_APMRESUMEAUTOMATIC: Result := 'PBT_APMRESUMEAUTOMATIC, Info: Operation is resuming automatically from a low-power state. This message is sent every time the system resumes.';
  else
    Result := 'Unknown Message "'+IntToStr(Msg)+'"';
  end;
end;

constructor TMyClass.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  // Create hidden window using WndMethod as window proc
  fHWnd := AllocateHWnd(WndMethod);

end;

destructor TMyClass.Destroy;
begin

  // Destroy hidden window
  DeallocateHWnd(fHWnd);

  inherited Destroy;
end;

procedure TMyClass.WndMethod(var Msg : TMessage);
begin

  case Msg.Msg of

   WM_POWERBROADCAST: begin
    // windows powermanagement message

    FormPowerWatch.Memo1.Lines.Append(TimeToStr(now) + ' Msg: '+TranslatePowerBroadcast(Msg.Msg));
    FormPowerWatch.Memo1.Lines.Append(TimeToStr(now) + ' WParam: '+TranslatePowerBroadcast(Msg.WParam));
    FormPowerWatch.Memo1.Lines.Append('');
   end;

  end;

    // pass to DefWindowProc and record result
    Msg.Result := DefWindowProc(fHWnd, Msg.Msg,
      Msg.WParam, Msg.LParam);
end;

end.
(Die FormPowerWatch dient nurmehr als Dummy für das Memo, die WM Message wurde entfernt)

Jedoch auch hier wird nur das zurückkommen vom Standby erkannt. Nix mit PBT_APMSUSPEND! Nur PBT_APMRESUMEAUTOMATIC & PBT_APMRESUMESUSPEND.
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Standby zurück wird nicht erkannt?

  Alt 16. Jan 2010, 11:33
Ich quäle mich auch seit ein paar Tagen mit dem gleichen Prob in einer DLL herum.
Du solltest zunächst mal versuchen, deine Form anders zu erzeugen:
Delphi-Quellcode:
if not Assigned(FormPowerWatch) then
          FormPowerWatch := TFormPowerWatch.Create(Application);
Ich bin zunächst darüber gestolpert, das ein 'Wachwerden' nicht erkannt wurde, weil ich nur auf PBT_APMRESUMESUSPEND und PBT_APMRESUMESTANDBY geprüft habe.

PBT_APMRESUMESTANDBY kommt bei mir gar nicht und PBT_APMRESUMESUSPEND nur, wenn eine Taste gedrückt oder die Maus bewegt wird.

PBT_APMRESUMEAUTOMATIC ($0012) hingegen kommt immer - egal aus welchem 'Schlafzustand' geweckt wird.

Dann solltest du vielleicht noch in deiner WMPowerBroadcast-Procedure auf das Case zur Abfrage von Msg.Msg verzichten und gleich in ein Case für Msg.wParam springen und prüfen.
Bei der Deklaration

procedure WMPowerBroadcast(var MyMessage: TMessage); message WM_POWERBROADCAST;

wird ja schon vorgegeben, auf welche message reagiert werden soll...

Bei mir sieht das so aus:
Delphi-Quellcode:
procedure TFWUC_MAIN.WMPowerBroadcast(var Msg: TMessage);
begin
  LOG('... PowerBroadcast: ' + inttostr(Msg.wParam) + ' - ' + inttostr(Msg.lParam));
  case Msg.wParam of
    PBT_APMSUSPEND,
    PBT_APMSTANDBY:
    begin
      // System geht in Standby
      LOG('... geht in StandBy/Hibernate');
      MachHierWasNotwendigIstZumSchlafengehen;
    end;
    PBT_APMRESUMEAUTOMATIC :
// PBT_APMRESUMESUSPEND,
// PBT_APMRESUMESTANDBY:
    begin
      // System kommt aus dem Standby
      LOG('... ReActivate ...');
      MachHierWasNotwendigIstNachWachwerden;
    end;
  end;
  msg.Result := 1
end;
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:39 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