Jump to content
c0d3r

Getting Windows Sleep message, works for some computers but doesn't work for others.

Recommended Posts

HI,  All

 

I'm getting a strange issue, the following codes were trying logout users when Windows is going to sleep mode. For some reason,  it works for some laptops, but it doesn't work for others:

 

procedure WMPowerBroadCast(var Msg: TMessage); message WM_POWERBROADCAST;

 

procedure TMainForm.WMPowerBroadCast(var Msg: TMessage);
begin
  if (Msg.wParam = PBT_APMSUSPEND) or (Msg.wParam = PBT_APMSTANDBY) then
  begin
    try
      Signout;
    except
    end;
    Msg.Result := 1;
  end;
end;

 

Got the report from my client,  the signout routine didn't get called when some laptops went to sleep (leave them opened and auto entered Sleep mode or Hitting Power button to force sleeping),  but other laptops/PCs were working just fine.

 

Edited by c0d3r

Share this post


Link to post

my tests if SHUTDOWN

 

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    BtnDisplayTurnOFF: TButton;
    procedure BtnDisplayTurnOFFClick(Sender: TObject);
  private
    { Private declarations }
  public
    // WM_QUERYENDSESSION  when MSWindows start the "shutdown" or "restart"...
    procedure MyWMPowerBroadcastMessage(var AMessage: TMessage); message WM_POWERBROADCAST;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  MY_MONITOR_OFF = 2;

  { TForm1 }

procedure TForm1.BtnDisplayTurnOFFClick(Sender: TObject);
begin
  SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, MY_MONITOR_OFF);
end;

procedure TForm1.MyWMPowerBroadcastMessage(var AMessage: TMessage);
begin
  case AMessage.WParam of
    PBT_APMQUERYSUSPEND:
      Memo1.Lines.Add('pc was PBT_APMQUERYSUSPEND at ' + DateTimeToStr(now));
    PBT_APMQUERYSTANDBY:
      Memo1.Lines.Add('pc was PBT_APMQUERYSTANDBY at ' + DateTimeToStr(now));
    PBT_APMQUERYSUSPENDFAILED:
      Memo1.Lines.Add('pc was PBT_APMQUERYSUSPENDFAILED at ' + DateTimeToStr(now));
    PBT_APMQUERYSTANDBYFAILED:
      Memo1.Lines.Add('pc was PBT_APMQUERYSTANDBYFAILED at ' + DateTimeToStr(now));
    PBT_APMSUSPEND:
      Memo1.Lines.Add('pc was PBT_APMSUSPEND at ' + DateTimeToStr(now));
    PBT_APMSTANDBY:
      Memo1.Lines.Add('pc was PBT_APMSTANDBY at ' + DateTimeToStr(now));
    PBT_APMRESUMECRITICAL:
      Memo1.Lines.Add('pc was PBT_APMRESUMECRITICAL at ' + DateTimeToStr(now));
    PBT_APMRESUMESUSPEND:
      Memo1.Lines.Add('pc was PBT_APMRESUMESUSPEND at ' + DateTimeToStr(now));
    PBT_APMRESUMESTANDBY:
      Memo1.Lines.Add('pc was PBT_APMRESUMESTANDBY at ' + DateTimeToStr(now));
    // PBTF_APMRESUMEFROMFAILURE: = PBT_APMQUERYSTANDBY
    // Memo1.Lines.Add('pc was PBTF_APMRESUMEFROMFAILURE at ' + DateTimeToStr(now));
    PBT_APMBATTERYLOW:
      Memo1.Lines.Add('pc was PBT_APMBATTERYLOW at ' + DateTimeToStr(now));
    PBT_APMPOWERSTATUSCHANGE:
      Memo1.Lines.Add('pc was PBT_APMPOWERSTATUSCHANGE at ' + DateTimeToStr(now));
    PBT_APMOEMEVENT:
      Memo1.Lines.Add('pc was PBT_APMOEMEVENT at ' + DateTimeToStr(now));
    PBT_APMRESUMEAUTOMATIC:
      Memo1.Lines.Add('pc was PBT_APMRESUMEAUTOMATIC at ' + DateTimeToStr(now));
    PBT_POWERSETTINGCHANGE:
      Memo1.Lines.Add('pc was PBT_POWERSETTINGCHANGE at ' + DateTimeToStr(now));
  else
    // you're going to want to handle PBT_APMRESUMECRITICAL (XP and older systems) and PBT_APMRESUMEAUTOMATIC differently
    // IIRC you did not get notification of the suspend in this case
    Memo1.Lines.Add('pc was <<OTHER NON-REPORTED>> at ' + DateTimeToStr(now));
  end;
end;

end.

 

Share this post


Link to post
16 minutes ago, Angus Robertson said:

Check the WM_POWER message as well.

 

Angus

 

The WM_POWER message is obsolete. It is provided only for compatibility with 16-bit Windows-based applications. Applications should use the WM_POWERBROADCAST message.

Share this post


Link to post
22 minutes ago, programmerdelphi2k said:

if many works, and 1 dont, my bet is: verify the setup BIOS, verify if same Windows edition or setup, etc...

Works for some, won't work for others (not only 1), and they are on Windows 10

Share this post


Link to post
32 minutes ago, programmerdelphi2k said:

my bet is: verify the setup BIOS

What should I look into?

Share this post


Link to post
7 hours ago, c0d3r said:

I'm getting a strange issue, the following codes were trying logout users when Windows is going to sleep mode. For some reason,  it works for some laptops, but it doesn't work for others

On Vista+, you can use RegisterPowerSettingNotification() to register to receive WM_POWERBROADCAST notifications for certain power events.

 

On Windows 8+, you can use PowerRegisterSuspendResumeNotification() to receive power notifications via a callback function instead of WM_POWERBROADCAST.

 

IIRC, however, modern Windows also has a newer fast standby/hibernation mode that doesn't sent power notifications to applications, it just pauses and resumes them as if nothing had happened.  I can't find the details about that, but I remember being involved in past discussions about it, I just don't remember where.

Share this post


Link to post
23 hours ago, Remy Lebeau said:

On Vista+, you can use RegisterPowerSettingNotification() to register to receive WM_POWERBROADCAST notifications for certain power events.

 

On Windows 8+, you can use PowerRegisterSuspendResumeNotification() to receive power notifications via a callback function instead of WM_POWERBROADCAST.

 

IIRC, however, modern Windows also has a newer fast standby/hibernation mode that doesn't sent power notifications to applications, it just pauses and resumes them as if nothing had happened.  I can't find the details about that, but I remember being involved in past discussions about it, I just don't remember where.

Something must be changed, was told it was working just fine on the same computer, and then stop working.  They are using Windows 10.

Edited by c0d3r

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×