Sign in to follow this  
Followers 0

Standby (WM_POWERBROADCAST) Hooking

13 posts in this topic

#1 ·  Posted (edited)

hi folks:

this i what im currently using to check standby messages from windows and react on them:

#include "au3_inc\GuiConstantsEx.au3"

$logfile = @ScriptDir&"\mp_standby-hook.log"
$delystdby = 30   ;seconds to delay standby
$mes = ""

Global $WM_POWERBROADCAST         = 536
Global $PBT_APMQUERYSUSPEND       = 0x0000
Global $PBT_APMQUERYSTANDBY       = 0x0001
Global $PBT_APMQUERYSUSPENDFAILED = 0x0002
Global $PBT_APMQUERYSTANDBYFAILED = 0x0003
Global $PBT_APMSUSPEND            = 0x0004
Global $PBT_APMSTANDBY            = 0x0005
Global $PBT_APMRESUMECRITICAL     = 0x0006
Global $PBT_APMRESUMESUSPEND      = 0x0007
Global $PBT_APMRESUMESTANDBY      = 0x0008
Global $PBT_APMBATTERYLOW         = 0x0009
Global $PBT_APMPOWERSTATUSCHANGE  = 0x000A
Global $PBT_APMOEMEVENT           = 0x000B
Global $PBT_APMRESUMEAUTOMATIC    = 0x0012
Global $PBTF_APMRESUMEFROMFAILURE = 0x00000001
Global $ES_DISPLAY_REQUIRED       = 0x00000002; zero the display's idle timer
Global $ES_SYSTEM_REQUIRED        = 0x00000001; zero the system's idle timer
Global $ES_CONTINUOUS             = 0x80000000; keep the display or system on (doesn't work?)

$hGUI = GUICreate("Standby", 1,1,1,1,-1)
GUIRegisterMsg($WM_POWERBROADCAST, "Standby")  ;hook into win32 pm API
GUISetState(@SW_MINIMIZE,$hGUI)

$g_szVersion = "MP_StandBy-Hook"
If WinExists($g_szVersion) Then Exit ; It's already running
AutoItWinSetTitle($g_szVersion)
WriteToLog($g_szVersion&" started...")

While 1
    $GUIMsg = GUIGetMsg()
    Switch $GUIMsg
        Case $GUI_EVENT_CLOSE
            ExitLoop
    EndSwitch
    Sleep (60000) ; Sleep for a minute
WEnd

Func Standby($hWnd, $Msg, $wParam, $lParam)
    Switch $wParam
        Case $PBT_APMQUERYSUSPEND         ; gets called first on standby request 
            WriteToLog("PBT_APMQUERYSUSPEND received...")
            For $i=$delystdby to 1 Step -1
                DllCall("kernel32.dll","int","SetThreadExecutionState","int", $ES_SYSTEM_REQUIRED)
                WriteToLog("Delaying Standby: "&$i&" s.")
                Sleep(1000)
            Next

        Case $PBT_APMSUSPEND              ; gets called second on standby request 
            WriteToLog("PBT_APMSUSPEND received...")
            WriteToLog("Entering Standby...")

        Case $PBT_APMRESUMEAUTOMATIC      ; gets called first after resume
            WriteToLog("PBT_APMRESUMEAUTOMATIC received...")
            WriteToLog("Resuming from Standby..."

        Case $PBT_APMRESUMESUSPEND        ; gets called second after resume
            WriteToLog("PBT_APMRESUMESUSPEND received...")
            WriteToLog("Checking MediaPortal...")
            Sleep(5000)
            If Not ProcessExists("mediaportal.exe") Then
                Run("c:\_mp\mediaportal.exe","c:\_mp")
            EndIf
            Sleep(5000)
            WriteToLog("Running RTC updater...")
            ShellExecute("timeupdate.au3","","c:\_tvtools\")
            Sleep(5000)
            WriteToLog("Faking user interaction...")
            $pos = MouseGetPos()
            MouseMove($pos[0]+50, $pos[1]+50)
            MouseMove($pos[0]-50, $pos[1]-50)
            MouseMove($pos[0], $pos[1])

        Case $PBT_APMQUERYSTANDBY
            WriteToLog("PBT_APMQUERYSTANDBY received...")
        Case $PBT_APMQUERYSUSPENDFAILED
            WriteToLog("PBT_APMQUERYSUSPENDFAILED received...")
        Case $PBT_APMQUERYSTANDBYFAILED
            WriteToLog("PBT_APMQUERYSTANDBYFAILED received...")
        Case $PBT_APMRESUMECRITICAL
            WriteToLog("PBT_APMRESUMECRITICAL received...")
        Case $PBT_APMRESUMESTANDBY
            WriteToLog("PBT_APMRESUMESTANDBY received...")
        Case $PBT_APMSTANDBY
            WriteToLog("PBT_APMSTANDBY received...")
        Case $PBT_APMPOWERSTATUSCHANGE
            WriteToLog("PBT_APMPOWERSTATUSCHANGE received...")
        Case $PBT_APMOEMEVENT
            WriteToLog("PBT_APMOEMEVENT received...")
        Case Else
            WriteToLog("Some unknown standby related message received... WTF?")
    EndSwitch
EndFunc

Func WriteToLog($mes)
    $file=FileOpen($logfile,1)
    FileWrite($logfile,@MDAY&@MON&@YEAR&"-"&@HOUR&@MIN&@SEC&": "&$mes&@CRLF)
    FileClose($logfile)
Endfunc

...i could use some guide on optimizing this baby and also maybe some of you API gods might help on how i could send the BROADCAST_QUERY_DENY message instead of using SetThreadExecutionState if it's feasible? Also if someone can show me how i can react on System booting and shutting down events ?

Thanks in advance...

g_

Edited by g_BonE

...Fenster fährt mich Nüsse...

Share this post


Link to post
Share on other sites



#2 ·  Posted

what... nobody ? and i thought its such a nice example of what can be done with autoit :mellow:

...i could use some guide on optimizing this baby and also maybe some of you API gods might help on how i could send the BROADCAST_QUERY_DENY message instead of using SetThreadExecutionState if it's feasible? Also if someone can show me how i can react on System booting and shutting down events ?

Thanks in advance...

g_


...Fenster fährt mich Nüsse...

Share this post


Link to post
Share on other sites

#3 ·  Posted

To get the info that system is rebooting i now use a OnAutoItExit() function and look at the @ExitMethod to be equal to 4.

Func OnAutoItExit()
    Switch @EXITMETHOD
        Case 1
            WriteToLog($g_szVersion&" exited by Close...")
        Case 2
            WriteToLog($g_szVersion&" exited by SysTray...")
        Case 3
            WriteToLog($g_szVersion&" exited by LogOff...")
        Case 4
            WriteToLog($g_szVersion&" exited by Reboot...")
            WriteToLog("Rebooting system...")
    EndSwitch
EndFunc

...Fenster fährt mich Nüsse...

Share this post


Link to post
Share on other sites

#4 ·  Posted

Just to bump this one up once more... i'm still looking for a way to send the BROADCAST_QUERY_DENY message via API. Anyone ?!?


...Fenster fährt mich Nüsse...

Share this post


Link to post
Share on other sites

#5 ·  Posted

g_BonE

How to prevent from the suspend message?

Just return the $BROADCAST_QUERY_DENY value.

Global Const $WM_POWERBROADCAST    = 0x0218
Global Const $PBT_APMQUERYSUSPEND  = 0x0000
Global Const $BROADCAST_QUERY_DENY = 0x424D5144

HotKeySet("{Pause}", "_Exit")

$hGUI = GUICreate("Test GUI")

$TestButton = GUICtrlCreateButton("Test", 60, 37, 75, 23)

GUIRegisterMsg($WM_POWERBROADCAST, "WM_POWERBROADCAST")

While 1
    Sleep(100)
WEnd

Func WM_POWERBROADCAST($hWnd, $Msg, $wParam, $lParam)
    Switch $wParam
        Case $PBT_APMQUERYSUSPEND
            Return $BROADCAST_QUERY_DENY
    EndSwitch
EndFunc

Func _Exit()
    Exit
EndFunc

:)

Share this post


Link to post
Share on other sites

#6 ·  Posted

The first bit of code is really useful thanks. Follow ups are good also. I'm interested in making an energy usage measuring tool. Happy to post anything useful anyone already working on such a project?

Share this post


Link to post
Share on other sites

#7 ·  Posted

thanks rasim, that was exactly what i'd been looking for. where did you get the hex number for $BROADCAST_QUERY_DENY = 0x424D5144 from ?


...Fenster fährt mich Nüsse...

Share this post


Link to post
Share on other sites

#8 ·  Posted

Very Thanks ,this is what i needed

Share this post


Link to post
Share on other sites

#9 ·  Posted

@rasim

does this work too for pushing the powerbutton, or only for system-powersaving-events?

if someone pushes the powerbutton 4 seconds, its not preventable, right? (because a bios-routine is called)


AutoIt-Syntaxsheme for Proton & Phase5 * Firefox Addons by me (resizable Textarea 0.1d) (docked JS-Console 0.1.1)

Share this post


Link to post
Share on other sites

#10 ·  Posted

@rasim

does this work too for pushing the powerbutton, or only for system-powersaving-events?

if someone pushes the powerbutton 4 seconds, its not preventable, right? (because a bios-routine is called)

Are you trying to be funny or something? Someone who was last seen 2 years ago is not going to answer.

Share this post


Link to post
Share on other sites

#11 ·  Posted

Are you trying to be funny or something? Someone who was last seen 2 years ago is not going to answer.

oh :-O

maybe, someone other knows the answer? possibly you?


AutoIt-Syntaxsheme for Proton & Phase5 * Firefox Addons by me (resizable Textarea 0.1d) (docked JS-Console 0.1.1)

Share this post


Link to post
Share on other sites

#12 ·  Posted

I agree that the 4 second thing is probably done by the motherboard somehow.

Don't know about a shirt press, why don't you try?

PS See when someone was last on line on the left side of their profile (click their name)

Share this post


Link to post
Share on other sites

#13 ·  Posted

short press on powerbutton will trigger shutdown (depends on the settings). this i may supress.

only the long press i probatly can't.


AutoIt-Syntaxsheme for Proton & Phase5 * Firefox Addons by me (resizable Textarea 0.1d) (docked JS-Console 0.1.1)

Share this post


Link to post
Share on other sites

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
Sign in to follow this  
Followers 0