Jump to content
Sign in to follow this  
Guest

GetDisplayState [UDF]

Recommended Posts

Guest

 I needed a function that checks whether the display/monitor is on or off and because I didn't find one I wrote this:

; #FUNCTION# ====================================================================================================================
; Name ..........: _DisplayState
; Description ...: Checks if a display is on or off.
; Syntax ........: _DisplayState()
; Parameters ....: None
; Return values..: Success - 1 = screen is on
;                             0 = screen is off
;                  Failure - -1 and sets the @error flag to non-zero.
; Author ........: syk3s
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........: @@MsdnLink@@ RegisterPowerSettingNotification
; Example .......: No
; ===============================================================================================================================
Func _DisplayState($hWndGUI = 0, $MsgID = 0, $WParam = 0, $LParam = 0)
    Local Const $_GUID_MONITOR_POWER_ON = '{02731015-4510-4526-99E6-E5A17EBD1AEA}'
    Local Const $_tagGUID = "ulong Data1;ushort Data2;ushort Data3;byte Data4[8]"
    If IsDeclared($_iDisplayState) = 0 Then Global $_iDisplayState = -1
    If $hWndGUI = 0 And $MsgID = 0 Then
        Global $_iDisplayState = -1
        Local Const $_WM_POWERBROADCAST = 0x0218
        Local $hTemp, $tGUID, $Ret
        Local $hTemp = GUICreate("Display state")
        If IsHWnd($hTemp) = 0 Then
            Return SetError(1, 0, -1)
        EndIf
        If GUIRegisterMsg($_WM_POWERBROADCAST, "_DisplayState") = 0 Then
            Return SetError(2, 0, -1)
        EndIf
        ;register for a display state broadcast
        $tGUID = DllStructCreate($_tagGUID)
        If @error Then
            Return SetError(3, 0, -1)
        EndIf
        $Ret = DllCall('ole32.dll', 'uint', 'CLSIDFromString', 'wstr', $_GUID_MONITOR_POWER_ON, 'ptr', DllStructGetPtr($tGUID))
        If (@error) Or ($Ret[0]) Then
            Return SetError(4, 0, -1)
        EndIf
        $Ret = DllCall('user32.dll', 'ptr', 'RegisterPowerSettingNotification', 'hwnd', $hTemp, 'ptr', DllStructGetPtr($tGUID), 'dword', 0) ;register for the event
        If (@error) Or (Not $Ret[0]) Then
            Return SetError(5, 0, -1)
        EndIf
        DllCall('user32.dll', 'int', 'UnregisterPowerSettingNotification', 'ptr', $Ret[0]) ;unregister
        GUIDelete($hTemp)
        If $_iDisplayState <> 0 And $_iDisplayState <> 1 Then
            Return SetError(6, 0, -1)
        Else
            Return $_iDisplayState
        EndIf
    Else
        Local $stPOWERBROADCAST_SETTING = DllStructCreate($_tagGUID & ";DWORD;byte[1]", $LParam)
        Local $aResult = DllCall("ole32.dll", "int", "StringFromGUID2", "struct*", DllStructGetPtr($stPOWERBROADCAST_SETTING), "wstr", "", "int", 40) ;get string GUID back
        If $aResult[2] = $_GUID_MONITOR_POWER_ON Then $_iDisplayState = DllStructGetData($stPOWERBROADCAST_SETTING, 6, 1)
    EndIf
EndFunc   ;==>_DisplayState

If you have some ideas for improvement, please post them below.

Note: works only with Vista+ and maybe doesn't work with Windows 8, needs testing

Edited by Guest

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...