April 19, 2024, 04:04:44 PM

News:

IonicWind Snippit Manager 2.xx Released!  Install it on a memory stick and take it with you!  With or without IWBasic!


WMI Power Plan changer - Win32_PowerPlan

Started by sapero, July 06, 2011, 12:06:38 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

sapero

This example requires Windows 7 or Windows Server 2008 R2, and of course the latest IWBasic compiler ;D

Win32_PowerPlan Class

Represents a power plan on a system. A power plan or scheme consists of a group of power settings and preference information.
[read more]

' 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