DonationCoder.com Software > Post New Requests Here
[REQ] Disable sleep/hibernation one time to drain battery
vevola:
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:
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) ExitEndFunc ; Get all power schemes using powercfg.exe /listFunc _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 performanceFunc _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 & @CRLFEndFunc ; 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 & @CRLFEndFunc ; Set RunOnce to restore the current power scheme on rebootFunc _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 EndIfEndFunc ; Change the system to use the maximum power scheme, for XP we put quotes around itFunc _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' & @CRLFEndFunc ; 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.
4wd:
Updated, see above - now reverts system on second run.
vevola:
Just curious as to whether I should be "seeing" something (some type of visual feedback), because I don't... :-[
Ath:
Just curious as to whether I should be "seeing" something (some type of visual feedback), because I don't... :-[
-vevola (January 12, 2012, 05:02 AM)
--- End quote ---
it doesn't have any output, (unless there's an error)
-4wd (January 05, 2012, 10:02 PM)
--- End quote ---
Sounds like all is good ;D
Navigation
[0] Message Index
[#] Next page
Go to full version