Jump to content
Sign in to follow this  

GetDisplayState [UDF]

Recommended Posts


 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)
        If GUIRegisterMsg($_WM_POWERBROADCAST, "_DisplayState") = 0 Then
            Return SetError(2, 0, -1)
        ;register for a display state broadcast
        $tGUID = DllStructCreate($_tagGUID)
        If @error Then
            Return SetError(3, 0, -1)
        $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)
        $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)
        DllCall('user32.dll', 'int', 'UnregisterPowerSettingNotification', 'ptr', $Ret[0]) ;unregister
        If $_iDisplayState <> 0 And $_iDisplayState <> 1 Then
            Return SetError(6, 0, -1)
            Return $_iDisplayState
        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)
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 syk3s
  • Like 1

An honorory member of The League Against Messy Signatures

Share this post

Link to post
Share on other sites

thx for the code~~


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  


Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.