' WMI Power Plan changer - requires Windows 7, Windows Server 2008 R2
IDispatch wmiSvc = GetComObject(0, "winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2\\power")
if (!wmiSvc)
MESSAGEBOX 0, "Sorry, root\\cimv2\\power namespace is missing.\n"_
"Probably you aren't running under Windows 7 or Windows Server 2008 R2", "Error"
end
endif
$region definitions
CONST CB_ADDSTRING = 0x0143
CONST CB_GETITEMDATA = 0x0150
CONST CB_SETITEMDATA = 0x0151
CONST CB_RESETCONTENT = 0x014B
CONST IDC_STATIC = 1000
CONST IDC_NAMES = 1001
CONST IDC_GROUP = 1002
CONST IDC_DESCRIPTION = 1004
CONST IDC_ACTIVATE = 1005
CONST IDC_REFRESH = 1006
DIALOG d1
' define two types for the dispatch stuff below
typedef BSTR pointer
typedef BOOL int
$endregion
CREATEDIALOG d1,0,0,300,182,0x80CA0080,0,"Change power-plan",&d1_handler
CONTROL d1,@STATIC,"Choose a plan",12,12,80,20,0x5000010B,IDC_STATIC
CONTROL d1,@COMBOBOX,"ComboBox1",98,10,188,158,0x50A10642,IDC_NAMES
CONTROL d1,@GROUPBOX,"Description",16,44,270,72,0x50000007,IDC_GROUP
CONTROL d1,@EDIT,"",22,60,258,46,0x50810844,IDC_DESCRIPTION
CONTROL d1,@SYSBUTTON,"Activate",60,130,78,26,0x50010000,IDC_ACTIVATE
CONTROL d1,@SYSBUTTON,"Refresh",140,130,78,26,0x50010000,IDC_REFRESH
DOMODAL d1
delete wmiSvc ' or wmiSvc->Release()
end
SUB d1_handler(),int
static int locked
SELECT @MESSAGE
CASE @IDINITDIALOG
CENTERWINDOW d1
locked = 1
EnumeratePlans()
locked = 0
CASE @IDCLOSEWINDOW
locked = 1
Cleanup()
CLOSEDIALOG d1,@IDOK
$macro MAKELONG(id, code) (id|code<<16)
CASE @IDCONTROL
SELECT MAKELONG(@CONTROLID, @NOTIFYCODE)
CASE MAKELONG(IDC_NAMES, @CBNSELCHANGE)
if (!locked) then UpdateDescription(GETSELECTED(d1,IDC_NAMES))
CASE MAKELONG(IDC_ACTIVATE, 0)
if (!locked) then ActivatePlan(GETSELECTED(d1,IDC_NAMES))
CASE MAKELONG(IDC_REFRESH, 0)
locked=1
Cleanup()
SENDMESSAGE d1, CB_RESETCONTENT, 0, 0, IDC_NAMES
EnumeratePlans()
locked=0
ENDSELECT
ENDSELECT
RETURN 0
ENDSUB
sub EnumeratePlans()
IDispatch colItems, pwrplan
colItems = wmiSvc.ExecQuery("SELECT ElementName,IsActive,Description FROM Win32_PowerPlan")
if (colItems)
IUnknown pEnum = ComEnumBegin(colItems, NULL)
if (pEnum)
for pwrplan = each pEnum
BSTR bstrName = pwrplan.ElementName
BOOL IsActive = pwrplan.IsActive
BSTR bstrDescription = pwrplan.Description
int i = SENDMESSAGE(d1, CB_ADDSTRING, 0, W2S(*<WSTRING>bstrName), IDC_NAMES)
SENDMESSAGE(d1, CB_SETITEMDATA, i, bstrDescription, IDC_NAMES)
if (IsActive)
SETSELECTED d1, IDC_NAMES, i
UpdateDescription(i)
ENABLECONTROL d1, IDC_ACTIVATE, FALSE
endif
FreeComString(bstrName)
next
delete pEnum
endif
delete colItems
endif
endsub
sub UpdateDescription(int i)
if (i == -1)
' none selected
SETCONTROLTEXT(d1, IDC_DESCRIPTION, "")
else
BSTR bstrDescription = SENDMESSAGE(d1, CB_GETITEMDATA, i, 0, IDC_NAMES)
if (bstrDescription)
SETCONTROLTEXT(d1, IDC_DESCRIPTION, W2S(*<WSTRING>bstrDescription))
endif
endif
ENABLECONTROL d1, IDC_ACTIVATE, i>=0
endsub
sub ActivatePlan(int i)
IDispatch colItems, pwrplan
if (i>=0) ' a valid plan must be selected
BOOL found = FALSE
HEAP PlanName = GETSTRING(d1, IDC_NAMES, i)
colItems = wmiSvc.ExecQuery("SELECT ElementName FROM Win32_PowerPlan")
if (colItems)
IUnknown pEnum = ComEnumBegin(colItems, NULL)
if (pEnum)
for pwrplan = each pEnum
BSTR bstrName = pwrplan.ElementName
if (PlanName == W2S(*<WSTRING>bstrName))
found = TRUE
uint hr = pwrplan.Activate()
if (hr&0x80000000)
MESSAGEBOX d1, "The method failed with error 0x"+HEX$(hr), "Error"
else
ENABLECONTROL d1, IDC_ACTIVATE, FALSE
endif
endif
next
delete pEnum
endif
delete colItems
endif
if (!found)
MESSAGEBOX d1, PlanName+" plan not found", "Error"
endif
FreeHeap PlanName
endif
endsub
sub Cleanup()
int i = GETSTRINGCOUNT(d1, IDC_NAMES)
while (i--)
BSTR bstrDescription = SENDMESSAGE(d1, CB_GETITEMDATA, i, 0, IDC_NAMES)
if (bstrDescription) then FreeComString(bstrDescription)
wend
endsub