funkey Posted November 19, 2014 Share Posted November 19, 2014 (edited) Hello! Here is a short example to get the notification when the monitors are going to sleep. Have fun! expandcollapse popup#NoTrayIcon Global Const $WM_POWERBROADCAST = 0x0218 Global Const $PBT_POWERSETTINGCHANGE = 0x8013 Global Const $WM_SYSCOMMAND = 0x0112 Global Const $SC_MONITORPOWER = 0xF170 Global Const $MONITOR_ON = -1 Global Const $MONITOR_OFF = 2 Global Const $MONITOR_STANDBY = 1 Global Const $tagGUID = "struct; ulong Data1;ushort Data2;ushort Data3;byte Data4[8]; endstruct" Global Const $tagPOWERBROADCAST_SETTING = $tagGUID & ";DWORD DataLength;DWORD Data;" Global Const $DEVICE_NOTIFY_WINDOW_HANDLE = 0 Global Const $DEVICE_NOTIFY_SERVICE_HANDLE = 1 Global Const $GUID_CONSOLE_DISPLAY_STATE = "{6fe69556-704a-47a0-8f24-c28d936fda47}" ; Win8 Global Const $GUID_MONITOR_POWER_ON = "{02731015-4510-4526-99e6-e5a17ebd1aea}" ; Vista and Win7 Global $hGui = GUICreate("Gui for registering Windows Message", 600, 400) GUIRegisterMsg($WM_POWERBROADCAST, "_PowerSettingNotification") Global $nBtnSleep = GUICtrlCreateButton("Hey monitors, please sleep!", 50, 50, 500, 100) GUICtrlSetFont(-1, 25) Global $nEdit = GUICtrlCreateEdit("Informations:", 50, 180, 500, 200, 0x200840) ;$WS_VSCROLL | $ES_AUTOVSCROLL | $ES_READONLY GUICtrlSetFont(-1, 14) Global $hNotify If @OSBuild >= 5000 And @OSBuild < 9000 Then $hNotify = _RegisterPowerSettingNotification($hGui, $GUID_MONITOR_POWER_ON) ElseIf @OSBuild >= 9000 Then $hNotify = _RegisterPowerSettingNotification($hGui, $GUID_CONSOLE_DISPLAY_STATE) Else MsgBox(64, "Sorry", "PowerSettingNotification is only supported by Windows Vista and above!") Exit EndIf If @error Then MsgBox(16, "Sorry", "PowerSettingNotification failed with error: " & @error & " - " & @extended & " !") Exit EndIf GUISetState() Global $iMsg Do $iMsg = GUIGetMsg() If $iMsg = $nBtnSleep Then DllCall('user32.dll', 'int', 'SendMessage', 'hwnd', $hGui, 'int', $WM_SYSCOMMAND, 'int', $SC_MONITORPOWER, 'int', $MONITOR_OFF) Until $iMsg = -3 _UnregisterPowerSettingNotification($hNotify) Func _PowerSettingNotification($hWndGUI, $MsgID, $wParam, $lParam) Local $tSetting, $iSetting Local $sDateNow, $sTimeNow, $sMsg If $wParam = $PBT_POWERSETTINGCHANGE Then $tSetting = DllStructCreate($tagPOWERBROADCAST_SETTING, $lParam) $iSetting = DllStructGetData($tSetting, "Data") $sDateNow = @YEAR & "-" & @MON & "-" & @MDAY $sTimeNow = @HOUR & ":" & @MIN & ":" & @SEC Switch $iSetting Case 2 ;The display is dimmed --> Win8 and above $sMsg = $sDateNow & " " & $sTimeNow & " : " & "The display is dimmed now" ConsoleWrite("> " & $sMsg & @CRLF) GUICtrlSetData($nEdit, GUICtrlRead($nEdit) & @CRLF & $sMsg) ;do some stuff here Case 1 ;The monitor in on $sMsg = $sDateNow & " " & $sTimeNow & " : " & "The display is on now" ConsoleWrite("> " & $sMsg & @CRLF) GUICtrlSetData($nEdit, GUICtrlRead($nEdit) & @CRLF & $sMsg) ;do some stuff here Case 0 ;The monitor in off $sMsg = $sDateNow & " " & $sTimeNow & " : " & "The display is off now" ConsoleWrite("> " & $sMsg & @CRLF) GUICtrlSetData($nEdit, GUICtrlRead($nEdit) & @CRLF & $sMsg) ;do some stuff here EndSwitch EndIf EndFunc ;==>_PowerSettingNotification Func _RegisterPowerSettingNotification($hGui, $GUID) Local $aRet Local $tGuid = DllStructCreate($tagGUID) $aRet = DllCall('ole32.dll', 'long', 'CLSIDFromString', 'wstr', $GUID, 'struct*', $tGuid) If @error Or $aRet[0] <> 0 Then Return SetError(1, @error, 0) $aRet = DllCall("user32.dll", "handle", "RegisterPowerSettingNotification", "handle", $hGui, "struct*", $tGuid, "DWORD", $DEVICE_NOTIFY_WINDOW_HANDLE) If @error Or $aRet[0] = 0 Then Return SetError(2, @error, 0) Return $aRet[0] EndFunc ;==>_RegisterPowerSettingNotification Func _UnregisterPowerSettingNotification($hNotify) Local $aRet = DllCall("user32.dll", "BOOL", "UnregisterPowerSettingNotification", "handle", $hNotify) If @error Or $aRet[0] = 0 Then Return SetError(1, @error, 0) Return $aRet[0] EndFunc ;==>_UnregisterPowerSettingNotification Edited November 19, 2014 by funkey mLipok and taravasya 2 Programming today is a race between software engineers striving tobuild bigger and better idiot-proof programs, and the Universetrying to produce bigger and better idiots.So far, the Universe is winning. Link to comment Share on other sites More sharing options...
UEZ Posted November 19, 2014 Share Posted November 19, 2014 FYI:_RegisterPowerSettingNotification <-> _WinAPI_RegisterPowerSettingNotification /_UnregisterPowerSettingNotification <-> _WinAPI_UnregisterPowerSettingNotificationare already included in WinAPISys.au3.Br,UEZ Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ Link to comment Share on other sites More sharing options...
funkey Posted November 19, 2014 Author Share Posted November 19, 2014 OMG! I already did a google search, but did not find it, sorry. Just see it as an another example how to use it. BTW: I still use V3.3.8.1 Programming today is a race between software engineers striving tobuild bigger and better idiot-proof programs, and the Universetrying to produce bigger and better idiots.So far, the Universe is winning. Link to comment Share on other sites More sharing options...
taravasya Posted March 2, 2016 Share Posted March 2, 2016 Hello, funkey! Can you give a more simple example please? I need to only register event then monitor is powerOFF or ON(one of this), but without buttons and info in GUI. I`m very new to AutoIt, and its hard to me found only needed strings in your script. BTW! I don`t see any information about _WinAPI_RegisterPowerSettingNotification even on offsite help-page... So.. your post is much more informative about this )))) Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now