DonationCoder.com forum
 
Read-only archive. This is a static copy of the DonationCoder.com forum. Reading and searching work as before; logging in, posting and private messages do not.
Archive of 2026-10-21 · About this archive · Main site

Author Topic: [REQ] Disable sleep/hibernation one time to drain battery  (Read 18,329 times)

vevola

  • VeVoLa
  • Charter Member
  • Joined in 2005
  • ***
  • Posts: 104
[REQ] Disable sleep/hibernation one time to drain battery
« on: January 06, 2012, 12:31 AM »
rather than having to manually change the settings, is there a little app that will temporarily disable sleep/hibernation so as to drain all the battery?

4wd

  • Pedantic Old Bastard
  • Supporting Member
  • Joined in 2006
  • **
  • Posts: 5,652
    • Coding Snacks
Re: [REQ] Disable sleep/hibernation one time to drain battery
« Reply #1 on: January 06, 2012, 04:02 AM »
Attached is a small program called PowerMaxTemp, (or PMT for short), that will change the current power scheme to either Always On on XP, (and possibly 2003), or High performance for Vista/7.

Normally both these schemes don't allow Standby/Hibernation, however if you've modified them then you'll just have to change them back now :)
(HINT: If you have changed them, make a copy and call them something else.)

Before changing the power scheme it will determine the current power scheme and then write a command into the RunOnce registry keys, [HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce], to change it back to the current scheme on the next (re)boot.

If you go into the registry editor after running it and look at the entry above you'll see a key similar to the following:

XP:          PMT           powercfg.exe /setactive "Minimal Power Management"
Vista/7:   PMT           powercfg.exe /setactive 381b4222-f694-41f0-9685-ff5bb260df2e

You can delete this key if you don't want it to execute on next boot.

The program will run from CLI or Desktop, there's a bit of error checking to see if powercfg.exe ran OK, it doesn't have any output, (unless there's an error), which I might add later.

It has been tested on my Win7HPx64 Desktop and XP Pro netbook and amazingly it worked.

Have fun.

Source code in AutoIt
Code: (autoit)
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=klaptopdaemon.ico
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
;PowerMaxTemp

#include <Array.au3>
#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include "_Startup.au3"
#include "_OsVersionInfo.au3"

Global $schemes, $MaxPowSch, $CurrPowSch, $Progress

If _OsVersionTest($VER_GREATER_EQUAL, 6, 0) Then
	$Progress = 'Vista/7 ' & StringLower(@CPUArch) & ' or higher'
Else
	$Progress = 'XP/2003 ' & StringLower(@CPUArch)
EndIf
$Progress = $Progress & @CRLF

_RevertOldSch()
_GetAllScheme()
_GetMaxPower()
_GetCurrentScheme()
_ResetPowerScheme()
_SetPowerScheme()
_Exit()


; Get me outta here!
Func _Exit()
	MsgBox(64, 'PowerMaxTemp', $Progress)
	Exit
EndFunc


; Get all power schemes using powercfg.exe /list
Func _GetAllScheme()
	Local $error
	Local $foo = Run(@comspec & ' /c powercfg.exe /list"', '.', @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD)
	If @error Then
		MsgBox(48, 'PowerMaxTemp error', 'Failed to run powercfg.exe /list')
	EndIf
	$PowSchList = ''
	While 1
		$PowSchList &= StdoutRead($foo)
	    If @error <> 0 Then ExitLoop
	WEnd
	$error = ''
	While 1
		$error &= StderrRead($foo)
	    If @error <> 0 Then ExitLoop
		If @extended > 0 Then
			$Progress = $Progress & 'Power schemes not read' & ' - Code: ' & @error & @CRLF & 'Exiting...'
			_Exit()
		EndIf
	WEnd
	StdioClose($foo)
	$schemes = StringSplit(StringStripWS($PowSchList, 4), @CR)
EndFunc


; Get the Maximum power scheme:
; XP: Always On
; Vista/7: High performance
Func _GetMaxPower()
	Local $i
	For $i = 1 To $schemes[0]
		If _OsVersionTest($VER_GREATER_EQUAL, 6, 0) Then
			If StringInStr($schemes[$i], 'High performance') > 0 Then $MaxPowSch = StringMid($schemes[$i], 20, (StringInStr($schemes[$i], ' ', 0, 1, 20) - 20))
		Else
			If StringInStr($schemes[$i], 'Always On') > 0 Then $MaxPowSch = "Always On"
		EndIf
	Next
	$Progress = $Progress & 'New scheme:		' & $MaxPowSch & @CRLF
EndFunc


; Get the current power scheme, in Vista/7 it's marked in the list with '*'.
; In XP we have to issue a powercfg /query command
; Vista/7 uses the GUID, XP uses the plain text name  -  Standards, who needs them?
Func _GetCurrentScheme()
	Local $i, $output, $error
	$Progress = $Progress & 'Current scheme:		'
	If _OsVersionTest($VER_GREATER_EQUAL, 6, 0) Then
		For $i = 1 To $schemes[0]
			If StringInStr($schemes[$i], '*') > 0 Then $CurrPowSch = StringMid($schemes[$i], 20, (StringInStr($schemes[$i], ' ', 0, 1, 20) - 20))
		Next
	Else
		Local $foo = Run(@comspec & ' /c powercfg.exe /query"', '.', @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD)
		If @error Then
			MsgBox(48, 'PowerMaxTemp error', 'Failed to run powercfg.exe /query')
		EndIf
		$output = ''
		While 1
			$output &= StdoutRead($foo)
			If @error <> 0 Then ExitLoop
		WEnd
		$error = ''
		While 1
			$error &= StderrRead($foo)
			If @error <> 0 Then ExitLoop
			If @extended > 0 Then
				$Progress = $Progress & 'Not read' & ' - Code: ' & @error & @CRLF
			EndIf
		WEnd
		StdioClose($foo)
		Local $XP = StringSplit(StringStripWS($output, 4), @CR)
		For $i = 0 To $XP[0]
			If StringLeft($XP[$i], 4) = 'Name' Then $CurrPowSch = StringStripWS(StringMid($XP[$i], 6), 4)
		Next
	EndIf
	If @extended <= 0 Then $Progress = $Progress & $CurrPowSch & @CRLF
EndFunc


; Set RunOnce to restore the current power scheme on reboot
Func _ResetPowerScheme()
	If _OsVersionTest($VER_GREATER_EQUAL, 6, 0) Then
		If _StartupRegistry_Install("PMT", "powercfg.exe /setactive " & $CurrPowSch, 1, 1) = 0 Then
			$Progress = $Progress & 'Install RunOnce:		Fail' & @CRLF
		Else
			$Progress = $Progress & 'Install RunOnce:		Done' & @CRLF
		EndIf
	Else
		If _StartupRegistry_Install("PMT", 'powercfg.exe /setactive "' & $CurrPowSch & '"', 1, 1) = 0 Then
			$Progress = $Progress & 'Install RunOnce:		Fail' & @CRLF
		Else
			$Progress = $Progress & 'Install RunOnce:		Done' & @CRLF
		EndIf
	EndIf
EndFunc


; Change the system to use the maximum power scheme, for XP we put quotes around it
Func _SetPowerScheme()
	Local $error
	If _OsVersionTest($VER_GREATER_EQUAL, 6, 0) Then
		Local $foo = Run(@comspec & ' /c powercfg.exe /setactive ' & $MaxPowSch, '.', @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD)
	Else
		Local $foo = Run(@comspec & ' /c powercfg.exe /setactive "' & $MaxPowSch & '"', '.', @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD)
	EndIf
	If @error Then
		MsgBox(48, 'PowerMaxTemp error', 'Failed to run powercfg.exe /setactive')
	EndIf
	$cps = ''
	While 1
		$cps &= StdoutRead($foo)
	    If @error <> 0 Then ExitLoop
	WEnd
	$error = ''
	While 1
		$error &= StderrRead($foo)
	    If @error <> 0 Then ExitLoop
		If @extended > 0 Then
			$Progress = $Progress & 'Set scheme:		Fail' & ' - Code: ' & @error & @CRLF
		EndIf
	WEnd
	StdioClose($foo)
	If @extended <= 0 Then $Progress = $Progress & 'Set scheme:		Done' & @CRLF
EndFunc


; When PMT is run, RunOnce is checked for key 'pmt'.
; If it exists: the old scheme is read, the command executed, and the 'pmt' key removed.
; If it doesn't exist the program carries on with setting High performance/Always On scheme.
Func _RevertOldSch()
	If @CPUArch = 'X64' Then
		Local $OldPowSch = RegRead("HKEY_LOCAL_MACHINE64\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce", "pmt")
	Else
		Local $OldPowSch = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce", "pmt")
	EndIf
	If $OldPowSch = '' Then
		$Progress = $Progress & 'Revert:			No' & @CRLF
		Return
	EndIf
	$Progress = $Progress & 'Revert:			Yes' & @CRLF
	Local $foo = Run(@comspec & ' /c ' & $OldPowSch, '.', @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD)
	If @error Then
		MsgBox(48, 'PowerMaxTemp error', 'Failed to run ' & $OldPowSch)
	EndIf
	$cps = ''
	While 1
		$cps &= StdoutRead($foo)
	    If @error <> 0 Then ExitLoop
	WEnd
	$error = ''
	While 1
		$error &= StderrRead($foo)
	    If @error <> 0 Then ExitLoop
		If @extended > 0 Then
			$Progress = $Progress & 'Scheme reset:		Fail' & ' - Code: ' & @error & @CRLF
		EndIf
	WEnd
	StdioClose($foo)
	If @extended <= 0 Then $Progress = $Progress & 'Scheme reset:		Done' & @CRLF
	If _StartupRegistry_Uninstall("PMT", $OldPowSch, 1, 1) = 0 Then
		$Progress = $Progress & 'Remove RunOnce:		Fail' & @CRLF
	Else
		$Progress = $Progress & 'Remove RunOnce:		Done' & @CRLF
	EndIf
	_Exit()
EndFunc

Updated:
20120112 - Running it a second time reverts to the original power scheme and clears the RunOnce\pmt key.
20120120 - Outputs results into a window.
"I will not follow where the path may lead, but I will go where there is no path, and I will leave a trail." - Muriel Strode, 1903
« Last Edit: January 20, 2012, 05:28 AM by 4wd »

4wd

  • Pedantic Old Bastard
  • Supporting Member
  • Joined in 2006
  • **
  • Posts: 5,652
    • Coding Snacks
Re: [REQ] Disable sleep/hibernation one time to drain battery
« Reply #2 on: January 12, 2012, 08:00 AM »
Updated, see above - now reverts system on second run.
"I will not follow where the path may lead, but I will go where there is no path, and I will leave a trail." - Muriel Strode, 1903

vevola

  • VeVoLa
  • Charter Member
  • Joined in 2005
  • ***
  • Posts: 104
Re: [REQ] Disable sleep/hibernation one time to drain battery
« Reply #3 on: January 12, 2012, 11:02 AM »
Just curious as to whether I should be "seeing" something (some type of visual feedback), because I don't...  :-[

Ath

  • Supporting Member
  • Joined in 2006
  • **
  • Posts: 3,649
    • Participated in NANY Challenge Eleven Times
    • Coding Snacks
    • Linux User
    • Hardware Hacker
Re: [REQ] Disable sleep/hibernation one time to drain battery
« Reply #4 on: January 12, 2012, 11:15 AM »
Just curious as to whether I should be "seeing" something (some type of visual feedback), because I don't...  :-[

it doesn't have any output, (unless there's an error)

Sounds like all is good ;D
/Ton
Ath's software collection, Quote: "A problem well stated is a problem half-solved." (Charles Kettering)

vevola

  • VeVoLa
  • Charter Member
  • Joined in 2005
  • ***
  • Posts: 104
Re: [REQ] Disable sleep/hibernation one time to drain battery
« Reply #5 on: January 12, 2012, 11:50 AM »
cool! thanks!!

4wd

  • Pedantic Old Bastard
  • Supporting Member
  • Joined in 2006
  • **
  • Posts: 5,652
    • Coding Snacks
Re: [REQ] Disable sleep/hibernation one time to drain battery
« Reply #6 on: January 13, 2012, 03:25 AM »
No visual output.....I'm a bit of a lazy coder :D

However, you should get aural feedback.  When my machines are switched to High performance/Always On the CPU fan goes into high gear ;)

I'll look at providing some kind of output window at the end.
"I will not follow where the path may lead, but I will go where there is no path, and I will leave a trail." - Muriel Strode, 1903

4wd

  • Pedantic Old Bastard
  • Supporting Member
  • Joined in 2006
  • **
  • Posts: 5,652
    • Coding Snacks
Re: [REQ] Disable sleep/hibernation one time to drain battery
« Reply #7 on: January 20, 2012, 05:32 AM »
Updated - now outputs to a window.

Run it once:
2012-01-20_15-35-27.jpg

Run it again:
2012-01-20_15-35-07.jpg

It will say Fail instead of Done if the powercfg.exe command failed, (and give the error), or the RunOnce registry entry couldn't be (re)set.

Unfortunately, it's not easy to determine how an AutoIt executable was launched, (CLI or Windows), so the output will always be to a window even if launched from the CLI.

I think that about covers it unless there's a problem - I might look at enabling/disabling Hibernate/Sleep from within the script, (to reduce reliance on powercfg.exe), but don't count on it.
"I will not follow where the path may lead, but I will go where there is no path, and I will leave a trail." - Muriel Strode, 1903

skwire

  • I eat Coding Snacks for breakfast...
  • Global Moderator
  • Joined in 2005
  • *****
  • Posts: 5,297
    • Participated in NANY Challenge Seventeen Times
    • Coding Snacks
    • Superboy Coder
    • Cody Award
    • Volunteers/Staff
    • Gathering Badge
Re: [REQ] Disable sleep/hibernation one time to drain battery
« Reply #8 on: January 20, 2012, 06:38 PM »
Nice work, 4wd.  :Thmbsup: vevola, please confirm this works for you and I'll mark and move this thread to Finished Programs. 

vevola

  • VeVoLa
  • Charter Member
  • Joined in 2005
  • ***
  • Posts: 104
Re: [REQ] Disable sleep/hibernation one time to drain battery
« Reply #9 on: February 18, 2012, 03:13 PM »
Well, it seems to first hibernate, and then on wake up it works...

Also... should I be running it *twice*? I'm not sure I understand your earlier post with the two screenshots...

4wd

  • Pedantic Old Bastard
  • Supporting Member
  • Joined in 2006
  • **
  • Posts: 5,652
    • Coding Snacks
Re: [REQ] Disable sleep/hibernation one time to drain battery
« Reply #10 on: February 19, 2012, 09:20 AM »
Well, it seems to first hibernate, and then on wake up it works...

What OS are you using?
What is the Power Scheme before you run it, (Control Panel->Power Options) ?
What is the Power Scheme after you run it ?

Always On or High Performance does not normally allow Sleep, Standby or Hibernate unless the Power Scheme has been changed by the user, (you should make a copy and change that instead).

Also... should I be running it *twice*? I'm not sure I understand your earlier post with the two screenshots...

Updated:
20120112 - Running it a second time reverts to the original power scheme and clears the RunOnce\pmt key.
20120120 - Outputs results into a window.

That's what the Revert in the output window signifies, Revert=Yes means it's being run for the second time and is setting the Power Scheme to it's original setting prior to the first time PMT was run, it also clears the RunOnce registry entry.
"I will not follow where the path may lead, but I will go where there is no path, and I will leave a trail." - Muriel Strode, 1903

vevola

  • VeVoLa
  • Charter Member
  • Joined in 2005
  • ***
  • Posts: 104
Re: [REQ] Disable sleep/hibernation one time to drain battery
« Reply #11 on: March 14, 2012, 08:41 PM »
I'm running Win7 64x with "Balanced" power scheme.

To be honest, I tried using the revert, but now hibernation doesn't work at all. When it goes to sleep, I can't wake it up anymore. I see "resuming", and then a black screen and I have to force shut it down. I then see "delete restoration data" or "resume", and I have to "delete" for windows to boot. Which also means that if I forget to save whatever I have open and go away for a while... well... I loose everything.

Any tips?

4wd

  • Pedantic Old Bastard
  • Supporting Member
  • Joined in 2006
  • **
  • Posts: 5,652
    • Coding Snacks
Re: [REQ] Disable sleep/hibernation one time to drain battery
« Reply #12 on: March 15, 2012, 12:41 AM »
OK, I'm going to need some more information:

Is your operating system on an SSD or HDD?

The output of the powercfg list command, (see below):

Quote
C:\>powercfg list

Existing Power Schemes (* Active)
-----------------------------------
Power Scheme GUID: 381b4222-f694-41f0-9685-ff5bb260df2e  (Balanced) *
Power Scheme GUID: 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c  (High performance)
Power Scheme GUID: a1841308-3541-4fab-bc81-f71556f20b4a  (Power saver)
Power Scheme GUID: e12bd28e-68a8-4f90-b0a5-f76b2b523ca3  (AMD Fusion Utility Recovery Profile)

Can you do a screengrab of PMTs output window when you run it both the first and second time, (like I did here), and either PM them to me or attach to a post.

Can you do a screengrab of both the Balanced and High Performance Advanced settings of your Power Options, the default for both of them should look like this:

Screenshot - 2012_03_15 , 11_33_30.jpg Screenshot - 2012_03_15 , 11_34_59.jpg

Also, after running it once what is the value of the PMT key stored under HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce (use regedit.exe) ?

What is it after running PMT a second time, (it shouldn't be there) ?
"I will not follow where the path may lead, but I will go where there is no path, and I will leave a trail." - Muriel Strode, 1903

vevola

  • VeVoLa
  • Charter Member
  • Joined in 2005
  • ***
  • Posts: 104
Re: [REQ] Disable sleep/hibernation one time to drain battery
« Reply #13 on: March 15, 2012, 09:45 AM »
Quote
Is your operating system on an SSD or HDD?
SSD

Quote
The output of the powercfg list command
Microsoft Windows [Version 6.1.7601]
Existing Power Schemes (* Active)
-----------------------------------
Power Scheme GUID: 381b4222-f694-41f0-9685-ff5bb260df2e  (Balanced)
Power Scheme GUID: 49ef8fc0-bb7f-488e-b6a0-f1fc77ec649b  (Dell)
Power Scheme GUID: 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c  (High performance)
Power Scheme GUID: a1841308-3541-4fab-bc81-f71556f20b4a  (Power saver) *

Quote
Can you do a screengrab of PMTs output window when you run it both the first and second time

Can you do a screengrab of both the Balanced and High Performance Advanced settings of your Power Options

Here's an archive with those screengrabs: http://dl.dropbox.com/u/7336846/pmt_screenshots.rar


Quote
Also, after running it once what is the value of the PMT key stored under HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce (use regedit.exe) ?

powercfg.exe /setactive a1841308-3541-4fab-bc81-f71556f20b4a

Quote
What is it after running PMT a second time, (it shouldn't be there) ?

And it's not.

Thanks for your help!

4wd

  • Pedantic Old Bastard
  • Supporting Member
  • Joined in 2006
  • **
  • Posts: 5,652
    • Coding Snacks
Re: [REQ] Disable sleep/hibernation one time to drain battery
« Reply #14 on: March 15, 2012, 12:42 PM »
Thanks, it shows that PMT is, (or trying to), switch from Power Saver to High Performance.

You didn't include the High Performance Advanced settings screengrab, could you please?

I'm running Win7 64x with "Balanced" power scheme.

The powercfg output shows you're running in the Power Saver scheme which is a bit more frugal than the Balanced scheme.

It also seems to indicate that there might be some form of power software installed by Dell, (only because I see a Dell power scheme there - AMD do the same thing if you run their Fusion software IIRC).

Quote
Thanks for your help!

No problem, it's just got me beat how it can be messing up your hibernation when all it does is swap power schemes, it doesn't change anything in those schemes.  It shouldn't even be going into Sleep/Hibernation when in High Performance, as you can see from my grab above, they're both set to Never by default.

You can also reset the power schemes to their default values by pressing the Restore Plan Defaults button under each schemes Advanced settings.

I've attached a small video of what happens when it runs - you can watch it change the power scheme each time it's run, (.7z because you can't attach .mp4 for some reason).

It's the equivalent of you typing in the following commands in a CLI, just as a matter of interest can you effect the same change from the CLI and does it do the same thing Hibernate-wise ?

powercfg /setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c  (should set to High Performance)
powercfg /setactive a1841308-3541-4fab-bc81-f71556f20b4a    (should set back to Power Saver)

Anyone else care to try it with a Win7 laptop and see what happens?
"I will not follow where the path may lead, but I will go where there is no path, and I will leave a trail." - Muriel Strode, 1903

Original address: https://www.donationcoder.com/forum/index.php?topic=29524.0