Jump to content

Wallpaper UDF


Recommended Posts

This UDF can be used to draw at the Desktop Wallpaper (Windows 8+) with GDI+ without using files.

The example runs with 60-120fps at my machine, so the speed is acceptable.

When the script exits, the original wallpaper is restored.

Have fun :).

PS: The UDF uses the window between the background and the icons, so it could be used to add an own child window at the desktop. Just look at the begin of __Wallpaper_Startup ($hWorkerW).



;Author: Kanashius@autoitscript.com, Kanashius@autoit.de, https://www.kanashius.com
#include "WallpaperUDF.au3"
#include <StaticConstants.au3>

; initialize own tray

; animation variables
Global Const $fDeg = ACos(-1) / 180 ;ACos(-1) is nearly pi
Global Const $iDots = 7, $fAngelDist = 360 / $iDots, $iRadius = 250
Global $aCoordinates[$iDots][2], $bIsFirst = True
Global $iX_Center, $iY_Center, $fAngle = 0

; fps-counter variables
Global $iFPSTextWidth = 100, $iFPSTextSize = 16, $iTimer, $iFrames = 0, $sFps = "FPS: 0"
Global $hPen, $hFamily, $hFont, $hFormat, $hBrush

; create gui
Global $iWidth = 180, $iHeight = 125
$hGui = GUICreate("Wallpaper UDF example", $iWidth, $iHeight, 10, 10)
$idLabelFps = GUICtrlCreateLabel($sFps, 10, 10, $iWidth-20, Default, $SS_CENTER)
$idBtnPR = GUICtrlCreateButton("Pause/Resume", 10, 30, $iWidth-20)
$idBtnClear = GUICtrlCreateButton("Clear", 10, 60, $iWidth-20)
$idBtnExit = GUICtrlCreateButton("Exit", 10, 90, $iWidth-20)
GUISetState(@SW_SHOW, $hGui)

; start the wallpaper drawing loop
__Wallpaper_Start(_draw, _init, _shutdown, _process)
If @error Then MsgBox(16, "Error", "Something went wrong starting initializing the wallpaper: "&@error)

Func _draw(ByRef $hGraphics, $iWidth, $iHeight, ByRef $arScreenInfo) ; will be called for each drawing cicle.
    ; Draw the animation
    For $i = 0 To $iDots - 1
            $aCoordinates[$i][0] = $iX_Center+Cos($fAngle*$fDeg)*$iRadius
            $aCoordinates[$i][1] = $iY_Center+Sin($fAngle*$fDeg)*$iRadius
            If Not $bIsFirst Then
                _GDIPlus_PenSetColor($hPen, 0xFFFFFF00)
                _GDIPlus_PenSetWidth($hPen, 2)
                _GDIPlus_GraphicsDrawLine($hGraphics, $aCoordinates[$i][0], $aCoordinates[$i][1], _
                                $aCoordinates[Mod(($i + $iDots / 2), $iDots)][0], $aCoordinates[Mod(($i + $iDots / 2), $iDots)][1], $hPen)
                _GDIPlus_PenSetColor($hPen, 0xFFFF8000)
                _GDIPlus_PenSetWidth($hPen, 3)
                If $i < $iDots - 1 Then _GDIPlus_GraphicsDrawLine($hGraphics, $aCoordinates[$i][0], $aCoordinates[$i][1], $aCoordinates[$i + 1][0], $aCoordinates[$i + 1][1], $hPen) ;;draw outer lines
            $fAngle += $fAngelDist
    If Not $bIsFirst Then _GDIPlus_GraphicsDrawLine($hGraphics, $aCoordinates[$i - 1][0], $aCoordinates[$i - 1][1], $aCoordinates[0][0], $aCoordinates[0][1], $hPen)
    $bIsFirst = False
    $fAngle -= 0.5

    ; update fps
    If TimerDiff($iTimer)>1000 Then
        $iFrames = 0
        $iTimer = TimerInit()
    $iFrames += 1
    ; draw fps
    $tLayout = _GDIPlus_RectFCreate($iX_Center - $iFPSTextWidth, $iY_Center - 4, $iFPSTextWidth*2, $iFPSTextSize+4)
    $aInfo = _GDIPlus_GraphicsMeasureString($hGraphics, $sFps, $hFont, $tLayout, $hFormat)
    _GDIPlus_GraphicsDrawStringEx($hGraphics, $sFps, $hFont, $aInfo[0], $hFormat, $hBrush)

    ; Return redraw areas
    Local $arAreas = [[$iX_Center-$iRadius,$iY_Center-$iRadius,$iX_Center+$iRadius,$iY_Center+$iRadius]] ; Set the areas that were redrawn and should be replaced
    return SetExtended(0, $arAreas) ; Change extended to the (min) time in ms to wait between each redraw. (This does not influence _process)

Func _updateFps($iFps)
    $sFps = "FPS: "&$iFps
    GUICtrlSetData($idLabelFps, $sFps)

Func _process()
    $iMsg = GUIGetMsg()
    Switch $iMsg
        Case -3, $idBtnExit
        Case $idBtnPR
        Case $idBtnClear

Func _init($iWidth, $iHeight, ByRef $arScreenInfo) ; The initialization method is called once before the draw loop starts.
    If UBound($arScreenInfo) = 0 Then
        MsgBox(16, "Error", "It is difficult to draw a wallpaper without a screen.")
    $iTimer = TimerInit()
    $iX_Center = $arScreenInfo[0][0]+$arScreenInfo[0][2]/2
    $iY_Center = $arScreenInfo[0][1]+$arScreenInfo[0][3]/2
    $hPen = _GDIPlus_PenCreate(0xFFFF0000, 4)
    $hFamily = _GDIPlus_FontFamilyCreate("Arial")
    $hFont = _GDIPlus_FontCreate($hFamily, $iFPSTextSize)
    $hFormat = _GDIPlus_StringFormatCreate(0x4000)
    _GDIPlus_StringFormatSetAlign($hFormat, 1)
    $hBrush = _GDIPlus_BrushCreateSolid(0xFFFF0000)

Func _shutdown() ; The shutdown method is called at the end of the draw loop, after __Wallpaper_Exit was called.



WallpaperUDF.au3 WallpaperUDF Example.au3

Link to comment
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

  • Create New...