AutoHotkey Homepage AutoHotkey Community
Let's help each other out
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Running commands on standby, hibernation and resume events

 
Post new topic   Reply to topic    AutoHotkey Community Forum Index -> Scripts & Functions
View previous topic :: View next topic  
Author Message
RobOtter



Joined: 30 Jan 2005
Posts: 125
Location: Darmstadt, Germany

PostPosted: Thu Aug 02, 2007 10:07 am    Post subject: Running commands on standby, hibernation and resume events Reply with quote

Hi folks,

this little script can act as an example for doing something when the computer is sent into sleep (standby and hibernation) and also when it resumes from that state.

Have fun,
Rob

Code:
/*
   Mute on hibernation
   
   Purpose:
      Mute the internal speakers if the computer is sent into hibernation or standby mode.
      
      Some laptop models of Fujitsu-Siemens are making short beep sounds everytime
      they are sent into sleep mode. This annoying behavior cannot be switched off,
      so this program circumvents it by disabling the speakers before sleep mode and
      reactivating them when resuming from hibernation.
   
   Functioning:
      The program runs in background, listening for the system´s message to hibernate
      the computer. It then mutes the speakers and turns them on again after the
      computer woke up.
      The mute state is left untouched in case the speakers were not muted by this
      program.
      The program will create one registry entry to save the mute state.
   
   Requirements:
      - Windows 2000 and newer
      - Read and write permission to HKEY_CURRENT_USER registry stem.
      
   
   Author:  Dirk Schwarzmann
   Version: 0.2
   Date:    2007-08-02
   
   Contact:
      Dirk 'Rob' Schwarzmann
      http://www.dirk-schwarzmann.de
      mailto://dirk@dirk-schwarzmann.de
   
   Version history:
      0.1, 2007-08-01: Initial version
      0.2, 2007-08-02: Replace unreliable timer function by real power event parameters
*/

; Registry location to save the mute state
reg_root = HKEY_CURRENT_USER
reg_path = SessionInformation
reg_key  = MutedforSuspend

; Tray icon and menu definition
Menu, TRAY, Icon, MuteOnHibernate.ico, 1, 1
Menu, TRAY, Tip, Mute speakers on hibernation

; Listen to the Windows power event "WM_POWERBROADCAST" (ID: 0x218):
OnMessage(0x218, "func_WM_POWERBROADCAST")
Return

/*
   This function is executed if the system sends a power event.
   Parameters wParam and lParam define the type of event:
   
   lParam: always 0
   wParam:
      PBT_APMQUERYSUSPEND             0x0000
      PBT_APMQUERYSTANDBY             0x0001
      
      PBT_APMQUERYSUSPENDFAILED       0x0002
      PBT_APMQUERYSTANDBYFAILED       0x0003
      
      PBT_APMSUSPEND                  0x0004
      PBT_APMSTANDBY                  0x0005
      
      PBT_APMRESUMECRITICAL           0x0006
      PBT_APMRESUMESUSPEND            0x0007
      PBT_APMRESUMESTANDBY            0x0008
      
      PBTF_APMRESUMEFROMFAILURE       0x00000001
      
      PBT_APMBATTERYLOW               0x0009
      PBT_APMPOWERSTATUSCHANGE        0x000A
      
      PBT_APMOEMEVENT                 0x000B
      PBT_APMRESUMEAUTOMATIC          0x0012
      
      Source: http://weblogs.asp.net/ralfw/archive/2003/09/09/26908.aspx
*/
func_WM_POWERBROADCAST(wParam, lParam)
{
   Global reg_root, reg_path, reg_key
   
   If (lParam = 0) {
      ; PBT_APMSUSPEND or PBT_APMSTANDBY? -> System will sleep
      If (wParam = 4 OR wParam = 5) {
         ; Get mute state
         SoundGet, muteState, MASTER, MUTE, 1
         
         ; If sound was not already muted, we have to do it. Otherwise the user
         ; himself had muted the speakers so we must not do anything.
         If (muteState = "Off") {
            ; Mute the speakers...
            SoundSet, 1, MASTER, MUTE, 1
            ; ...and save the fact that WE have done that. This is necessary to
            ; reset the previous state after resuming from suspend mode.
            RegWrite, REG_DWORD, %reg_root%, %reg_path%, %reg_key%, 1
         }
      }
      
      ; PBT_APMRESUMESUSPEND oder PBT_APMRESUMESTANDBY? -> System wakes up
      If (wParam = 7 OR wParam = 8) {
         ; Did WE mute the speakers before?
         RegRead, muteState, %reg_root%, %reg_path%, %reg_key%
         
         ; If yes (muteState is 1), we have to switch on the speakers.
         ; Otherwise we do nothing because it was the user who had muted the speakers.
         If (muteState = "1") {
            RegWrite, REG_DWORD, %reg_root%, %reg_path%, %reg_key%, 0
            SoundSet, 0, MASTER, MUTE, 1
         }
      }
   }
   Return
}


Last edited by RobOtter on Thu Aug 02, 2007 1:10 pm; edited 1 time in total
Back to top
View user's profile Send private message
Z Gecko
Guest





PostPosted: Thu Aug 02, 2007 12:43 pm    Post subject: Reply with quote

Very cool,
detecting standby, hibernation and resuming can be very helpful.

Maybe you change the title of this topic,
to indicate that your script is not mainly about muting
but has a general usage.
Back to top
RobOtter



Joined: 30 Jan 2005
Posts: 125
Location: Darmstadt, Germany

PostPosted: Thu Aug 02, 2007 1:13 pm    Post subject: Reply with quote

[x] Done

Is this better? I guess it´s more general now...
Back to top
View user's profile Send private message
Z Gecko
Guest





PostPosted: Thu Aug 02, 2007 1:55 pm    Post subject: Reply with quote

Yes, indeed Wink
Back to top
ttzm



Joined: 17 Feb 2008
Posts: 8
Location: CHINA

PostPosted: Thu Apr 10, 2008 12:27 pm    Post subject: Reply with quote

Quote:
If (lParam = 0)


Without that you can also work!
Back to top
View user's profile Send private message Visit poster's website
Wouther



Joined: 01 May 2007
Posts: 78
Location: The Netherlands

PostPosted: Fri Apr 11, 2008 9:19 pm    Post subject: Reply with quote

Thankyou very much! I recently needed this and only found a solution that worked, but not very good.
Edit: Actually, I also found this WM_ message but I did not know the values of wParam when the pc returns from suspend/hibernation/etc. Thanks for the information! Very Happy
_________________
Printing css/html-formatted text
Back to top
View user's profile Send private message
jerry william



Joined: 12 Apr 2008
Posts: 3
Location: england

PostPosted: Sat Apr 12, 2008 6:23 am    Post subject: Reply with quote

hi friend,
how you doing?
Back to top
View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger
jerry william



Joined: 12 Apr 2008
Posts: 3
Location: england

PostPosted: Sat Apr 12, 2008 6:26 am    Post subject: From Mr Jerry Williams. Reply with quote

yeh will like you to get back to me so that we can move onto it
Mr Jerry.
Back to top
View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger
jerry william



Joined: 12 Apr 2008
Posts: 3
Location: england

PostPosted: Sat Apr 12, 2008 6:29 am    Post subject: Reply with quote

am fine and you?
Back to top
View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger
pepak



Joined: 26 Nov 2004
Posts: 21

PostPosted: Wed Jun 25, 2008 2:33 pm    Post subject: Reply with quote

Hmm, I have a problem with this. I wrote pretty much the same code before I even saw this post, but mine does not work at all. I only wanted to see if I am getting the messages, that's why the code only writes to a file:
Code:

OnMessage(0x218, "WM_POWERBROADCAST")
Return

WM_POWERBROADCAST(wParam, lParam)
{
   ; PBT_APMQUERYSUSPEND = 0
   ; PBT_APMRESUMESUSPEND = 7
   FileAppend, "powerbroadcast", Z:\Temp\pokus
   If (wParam == 0) {
      FileAppend, "suspend", Z:\Temp\pokus
      Return true
   } Else If (wParam = 7) {
      FileAppend, "resume", Z:\Temp\pokus
   }
}

For some reason, I don't get any output, which I take to mean that either WM_POWERBROADCAST never gets called or that my script doesn't catch it.
Back to top
View user's profile Send private message
Wouther



Joined: 01 May 2007
Posts: 78
Location: The Netherlands

PostPosted: Wed Jun 25, 2008 5:11 pm    Post subject: Reply with quote

I changed the path to my own tmp-directory and it works on my computer. I think the WM-part works, but you have to specify a file name instead of a folder for FileAppend.
pepak wrote:
Code:
FileAppend, "powerbroadcast", Z:\Temp\pokus.txt

_________________
Printing css/html-formatted text
Back to top
View user's profile Send private message
Repkam09



Joined: 11 Feb 2008
Posts: 6
Location: USA

PostPosted: Thu Jun 26, 2008 2:54 am    Post subject: Reply with quote

thank you! i had also just been looking for someway to detect returning from hibernation, as i never shut down my computer, and this looks like it could be helpful Smile


Thanks!

nice and simple too Very Happy
_________________
check out my little forum thing for a few more of my semi-uesless AHK programs and other stuff

http://repkam09.forumcircle.com/

[repkam09]
RuneScape/MoparScape Player Razz
Back to top
View user's profile Send private message AIM Address
Display posts from previous:   
Post new topic   Reply to topic    AutoHotkey Community Forum Index -> Scripts & Functions All times are GMT
Page 1 of 1

 
Jump to:  
You can post new topics in this forum
You can reply to topics in this forum


Powered by phpBB © 2001, 2005 phpBB Group