screencapture eines vollbild programms

  • ich habe mir aus der hilfe ein kleines tool gebastelt welches alle 250ms einen screenshot erstellt.
    es soll als media center hilfstool laufen und das mediacenter auf einem kontrolldisplay anzeigen.
    so muss beim musik hören nicht der beamer oder fernseher eingeschaltet werden.
    soweit funktioniert es schon, aber ich weiss nicht weiter.


    [autoit]

    $bild = _ScreenCapture_Capture(@ScriptDir&"\screencap.jpg", 50, 50, 200, 200)
    $n = GUICtrlCreatePic(@ScriptDir&"\screencap.jpg", 0, 0, 0, 0)

    [/autoit]

    1. soll mit variablen funktionieren und nicht immer auf die disk schreiben.
    2. sollte nach möglichkeit ein geöffnetes vollbild programm (media center) erkennen und nur davon ein bild machen. so wie ich das sehe geht das aber wohl nicht mits class.
    3. das angezeigte bild fängt an zu flackern, das muss weg; aber wie?
    4. der speicherverbrauch steigt kontinuierlich, obwohl ich doch abgeschlossende funktionen habe. weiss jemand warum und wie ich dem entgegenwirken kann?

    damit ihr einen überblick habt hier nun endlich mein wunderwerk der programmierkunst. :rofl::rofl:

    [autoit]

    #include <ScreenCapture.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiConstantsEx.au3>
    #include <ScreenCapture.au3>
    #include <WindowsConstants.au3>

    [/autoit][autoit][/autoit][autoit]

    Opt('MustDeclareVars', 1)
    Opt("GUIOnEventMode", 1) ;Wechsle in den OnEvent Modus

    [/autoit][autoit][/autoit][autoit]

    Global $gui, $guiPos, $pic, $picPos, $bild, $msg, $n, $a=0, $bild1
    Local $widht = InputBox("auflösung","widht")
    Local $height = InputBox("auflösung","widht")

    [/autoit][autoit][/autoit][autoit]

    GUICreate("screencap", $widht, $height, -1, -1, $WS_SIZEBOX + $WS_MAXIMIZEBOX + $WS_SYSMENU) ; Erstellt ein GUI-Fenster welches mittig ausgerichtet wird.
    GUISetBkColor(0x000000)

    [/autoit][autoit][/autoit][autoit]

    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
    GUISetState(@SW_SHOW) ;GUI anzeigen

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    While 1
    Sleep(1)
    screencapt()
    WEnd

    [/autoit][autoit][/autoit][autoit]

    Func screencapt()
    $bild = _ScreenCapture_Capture(@ScriptDir&"\screencap.jpg", 1080, 502, 1912, 1011) ; testresolution
    $n = GUICtrlCreatePic(@ScriptDir&"\screencap.jpg", 0, 0, $widht-4, $height-4) ; -4 px rand
    Sleep(250) ; screenshot intervall
    EndFunc ;==>Example1

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func CLOSEClicked() ;geht nur wenn keine andere funktion arbeitet
    Exit
    EndFunc ;==>CLOSEClicked

    [/autoit]

    für eure hilfe wäre ich euch sehr dankbar.

    im anschluss an die probleme werde ich dann noch die eingaben der infoboxen per iniwrite/read speichern und evt. auch die aktualisierungsrate anpassbar machen.
    wie das geht weiss ich allerdings

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.

    Einmal editiert, zuletzt von Maximus1 (31. Mai 2011 um 19:03)

  • Hi,

    1. soll mit variablen funktionieren und nicht immer auf die disk schreiben


    das geht so:


    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    Global $hdll_gdi32 = DllOpen("gdi32.dll")

    [/autoit] [autoit][/autoit] [autoit]

    $hDesktop = _WinAPI_GetDesktopWindow() ;Handle des Desktops hohlem
    $hDC_Desktop = _WinAPI_GetDC($hDesktop) ;Den Device Context vom Desktop ermitteln

    [/autoit] [autoit][/autoit] [autoit]

    $hGUI = GUICreate("Desktop", 1024, 768) ;Eine gui erstellen
    $hDC_GUI = _WinAPI_GetDC($hGUI) ;den DC davon ermitteln

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    DllCall($hdll_gdi32, "int", "SetStretchBltMode", "dword", $hDC_GUI, "int", 4) ;den schönen blit modus anstellen

    [/autoit] [autoit][/autoit] [autoit]

    While GUIGetMsg() <> -3
    _WinAPI_StretchBlt($hDC_GUI, 0, 0, 1024, 768, $hDC_Desktop, 0, 0, @DesktopWidth, @DesktopHeight, $SRCCOPY)
    ;Der Befehl transveriert den Inhalt des Desktop DC's auf die GUI DC und passt dabei die grösse an
    ;das gegenstück ohne grössenanpassung ist _WinAPI_BitBlt
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ;benutzte resourcen freigeben
    _WinAPI_ReleaseDC($hGUI, $hDC_GUI)
    _WinAPI_ReleaseDC($hDesktop, $hDC_Desktop)
    DllClose($hdll_gdi32)

    [/autoit] [autoit][/autoit] [autoit]

    ; Author.........: Yashied
    Func _WinAPI_StretchBlt($hDestDC, $iXDest, $iYDest, $iWidthDest, $iHeightDest, $hSrcDC, $iXSrc, $iYSrc, $iWidthSrc, $iHeightSrc, $iRop)

    [/autoit] [autoit][/autoit] [autoit]

    Local $Ret = DllCall($hdll_gdi32, 'int', 'StretchBlt', 'hwnd', $hDestDC, 'int', $iXDest, 'int', $iYDest, 'int', $iWidthDest, 'int', $iHeightDest, 'hwnd', $hSrcDC, 'int', $iXSrc, 'int', $iYSrc, 'int', $iWidthSrc, 'int', $iHeightSrc, 'dword', $iRop)

    [/autoit] [autoit][/autoit] [autoit]

    If (@error) Or (Not $Ret[0]) Then
    Return SetError(1, 0, 0)
    EndIf
    Return 1
    EndFunc ;==>_WinAPI_StretchBlt

    [/autoit]


    Zitat

    2. sollte nach möglichkeit ein geöffnetes vollbild programm (media center) erkennen und nur davon ein bild machen. so wie ich das sehe geht das aber wohl nicht mits class.

    [autoit]

    WinGetPos

    [/autoit]


    kann die Größe ermitteln. Ergo du brauchst nur mit @DesktopWidth und @DesktopHeight vergleichen

    Zitat

    3. das angezeigte bild fängt an zu flackern, das muss weg; aber wie?


    Das liegt an dem Image Control. Ist mit meinem Script gefixt.

    Zitat

    4. der speicherverbrauch steigt kontinuierlich, obwohl ich doch abgeschlossende funktionen habe. weiss jemand warum und wie ich dem entgegenwirken kann?


    Das liegt an der _ScreenCapture_Capture Funktion. Die erzeugt gewaltig Müll im Ram. (in meinem Script bleibt die Ram Auslastung gleich)

  • ich danke dir.

    jetzt muss ich da erstmal versuchen durchzusteigen und meins mit deinem zu verbinden.
    in der zwischenzeit hatte ich ja nicht untätig herumgesessen und auf ergebnisse gewartet.

    falls es interessiert, hier das ich bisher habe.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <ScreenCapture.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('MustDeclareVars', 1)
    Opt("GUIOnEventMode", 1) ;Wechsle in den OnEvent Modus

    [/autoit] [autoit][/autoit] [autoit]

    Global $msg, $n, $MCpos, $SCpos, $SCpos0, $SCpos1, $bild, $widht, $height, $fehler

    [/autoit] [autoit][/autoit] [autoit]

    Global $sFile = "auflösung.ini"
    If Not FileExists($sFile) Then
    eingabe()
    Else
    lesen()
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func eingabe()
    $widht = InputBox("auflösung", "breite des sideshow-display")
    $height = InputBox("auflösung", "höhe des sideshow-display")
    IniWrite($sFile, "widht", "widht", $widht)
    IniWrite($sFile, "height", "height", $height)
    EndFunc ;==>eingabe

    [/autoit] [autoit][/autoit] [autoit]

    Func lesen()
    $widht = IniRead($sFile, "widht", "widht", 1)
    $height = IniRead($sFile, "height", "height", 1)
    $SCpos0 = IniRead($sFile, "x", "x", 1)
    $SCpos1 = IniRead($sFile, "y", "y", 1)
    If $height = 0 Then
    $height = InputBox("auflösung", "höhe des sideshow-display")
    IniWrite($sFile, "height", "height", $height)
    EndIf
    If $widht = 0 Then
    $widht = InputBox("auflösung", "breite des sideshow-display")
    IniWrite($sFile, "widht", "widht", $widht)
    EndIf
    EndFunc ;==>lesen

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUICreate("screencap", $widht, $height, $SCpos0, $SCpos1, $WS_SIZEBOX + $WS_MAXIMIZEBOX + $WS_SYSMENU) ; Erstellt ein GUI-Fenster welches mittig ausgerichtet wird.
    GUISetBkColor(0x000000)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    WinWaitActive("[CLASS:eHome Render Window]"); warte auf das media center
    $MCpos = WinGetPos("Windows Media Center"); äussere koordinaten des media center abfragen
    If @error Then
    MsgBox(16, "Fehler", "Media Center Fenster nicht gefunden")
    $fehler = "Media Center Fenster nicht gefunden"
    CLOSE_error()
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW) ;GUI anzeigen

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(1)
    screencapt()
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func screencapt()
    $bild = _ScreenCapture_Capture(@ScriptDir & "\screencap.jpg", $MCpos[0], $MCpos[1], $MCpos[2], $MCpos[3])
    $n = GUICtrlCreatePic(@ScriptDir & "\screencap.jpg", 0, 0, $widht, $height)
    ;~ GUICtrlSetResizing(-1, $GUI_DOCKAUTO)
    Sleep(125)
    EndFunc ;==>screencapt

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func CLOSEClicked() ;geht nur wenn keine andere funktion arbeitet
    $SCpos = WinGetPos("screencap"); äussere koordinaten des anzeigefensters abfragen
    If Not @error Then
    IniWrite($sFile, "x", "x", $SCpos[0])
    IniWrite($sFile, "y", "y", $SCpos[1])
    IniWrite($sFile, "breite", "breite", $SCpos[2])
    IniWrite($sFile, "höhe", "höhe", $SCpos[3])
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Exit
    EndFunc ;==>CLOSEClicked

    [/autoit] [autoit][/autoit] [autoit]

    Func CLOSE_error() ;geht nur wenn keine andere funktion arbeitet
    FileOpen("fehler.txt", 1); fehlerdatei öffnen oder erstellen
    FileWriteLine("fehler.txt", "" & @MDAY & "." & @MON & "." & @YEAR & "_" & @HOUR & ":" & @MIN & " " & $fehler & @CRLF); datum und zeit und fehler reinschreiben
    FileClose("fehler.txt")
    Exit
    EndFunc ;==>CLOSE_error

    [/autoit]

    ach wie toll, ich verstehe von dem um was es da geht nicht ein wort.

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.

    Einmal editiert, zuletzt von Maximus1 (29. Mai 2011 um 04:01)

  • es gibt fortschritte zu vermelden.
    dank Sprengers script konnte ich nun meines dahingehend ändern, das es macht was ich will.
    nun habe ich nur noch ein problem.
    wenn ich das media center auf einem der monitore im fenstermodus laufen habe, wird mir alles gezeigt.
    aber das tool soll ja auch dann seinen job machen, wenn das Media Center auf dem anderen monitor im vollbild modus läuft.

    hat da einer vielleicht einen tip für mich?

    hier erstmal der aktuelle stand:

    :rock:

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1) ;Wechsle in den OnEvent Modus

    [/autoit] [autoit][/autoit] [autoit]

    Global $gui, $guiPos, $pic, $picPos, $msg, $n, $hdisplay, $MCpos, $SCpos,$SCpos0,$SCpos1, $bild, $widht, $height, $fehler, $counter =0, $ausg_quali=4, $Name1, $Name2, $msg, $time = 0, $pid,$border
    Global $hdll_gdi32 = DllOpen("gdi32.dll")
    Global $sFile = "auflösung.ini"

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    If Not FileExists($sFile) Then
    eingabe()
    Else
    lesen()
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func eingabe()
    $widht = InputBox("auflösung", "breite des side-display")
    $height = InputBox("auflösung", "höhe des side-display")
    $ausg_quali = InputBox("Bildqualität", "Es sind Werte zwischen 1 und 4 möglich." & @CRLF & "Je höher desto besser ist das Bild, aber auch die Systemauslastung")
    $Name1 = InputBox("Dein Name", "Besitzer")
    $Name2 = InputBox("Mein Name", "System")
    iniwrite_eingabe()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func lesen()
    iniread_lesen()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    If $widht <10 Then
    $widht = InputBox("auflösung", "breite des side-display")
    IniWrite($sFile, "widht", "widht", $widht)
    EndIf
    If $height <10 Then
    $height = InputBox("auflösung", "höhe des side-display")
    IniWrite($sFile, "height", "height", $height)
    EndIf
    If $ausg_quali <1 Then
    $ausg_quali = InputBox("Bildqualität", "Es sind Werte zwischen 1 und 4 möglich." & @CRLF & "Je höher desto besser ist das Bild, aber auch die Systemauslastung")
    IniWrite($sFile, "Qualität", "level", $ausg_quali)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    WinWait("Windows Media Center",'',5); warte auf das media center

    [/autoit] [autoit][/autoit] [autoit]

    #Region --- CodeWizard generated code Start ---
    ;MsgBox features: Title=Yes, Text=Yes, Buttons=Yes and No, Icon=Critical, Timeout=10 ss
    If Not IsDeclared("iMsgBoxAnswer") Then Local $iMsgBoxAnswer
    $iMsgBoxAnswer = MsgBox(20,"Fehler","Media Center nicht gefunden oder verdeckt"& @CRLF & "Media Center versuchen zu starten?",10)
    Select
    Case $iMsgBoxAnswer = 6 ;Yes
    Run(@WindowsDir & "\ehome\ehshell.exe",@WindowsDir & "\ehome")
    WinWaitActive("Windows Media Center",'',5); warte auf das media center
    Case $iMsgBoxAnswer = 7 ;No
    CLOSE_error()
    Case $iMsgBoxAnswer = -1 ;Timeout
    CLOSE_error()
    EndSelect
    #EndRegion --- CodeWizard generated code End ---

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    FensterMessen()
    $border = RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics","CaptionHeight") ; titelleiste lesen
    $border = $border/15

    [/autoit] [autoit][/autoit] [autoit]

    $hDesktop = _WinAPI_GetDesktopWindow() ;Handle des Desktops hohlem
    $hDC_Desktop = _WinAPI_GetDC($hDesktop) ;Den Device Context vom Desktop ermitteln

    [/autoit] [autoit][/autoit] [autoit]

    $hGUI = GUICreate("Desktop",$widht, $height, $SCpos0, $SCpos1, $WS_SIZEBOX + $WS_MAXIMIZEBOX + $WS_SYSMENU) ;Eine gui erstellen
    $hDC_GUI = _WinAPI_GetDC($hGUI) ;den DC davon ermitteln

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUISetBkColor(0x000000)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Guten = GUICtrlCreateLabel("Guten Tag " & $Name1 & "." & @CRLF &"Hier ist " & $Name2 &". "& @CRLF & @CRLF & "Ich wünsche dir viel Vergnügen",$widht/5,$height/3,$widht,$height/2)
    GUICtrlSetFont(-1, 20, 800, 0, "Hollywood Hills")
    GUICtrlSetColor(-1, 0x3399FF)
    Sleep(3000)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    DllCall($hdll_gdi32, "int", "SetStretchBltMode", "dword", $hDC_GUI, "int", $ausg_quali) ;den schönen blit modus anstellen

    [/autoit] [autoit][/autoit] [autoit]

    While(1)
    Sleep(1)
    MClesen()
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func MClesen()
    _WinAPI_StretchBlt($hDC_GUI,0, 0--$border, $widht,$height, $hDC_Desktop, $MCpos[0], $MCpos[1], $MCpos[2], $MCpos[3], $SRCCOPY) ; titelleiste wird von TOP abgezogen und das gemesseneMC wird in das gemessene/voreingestellte anzeigeprogramm eingepasst
    ;Der Befehl transveriert den Inhalt des Desktop DC's auf die GUI DC und passt dabei die grösse an
    ;das gegenstück ohne grössenanpassung ist _WinAPI_BitBlt
    $counter = $counter +1
    If $counter = 20 Then; alle 20 durchläufe wird
    FensterMessen() ; das fenster vom MC gemessen und als neuer richtwert übernommen
    $counter =0
    EndIf
    EndFunc ;==>MClesen

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Author.........: Yashied
    Func _WinAPI_StretchBlt($hDestDC, $iXDest, $iYDest, $iWidthDest, $iHeightDest, $hSrcDC, $iXSrc, $iYSrc, $iWidthSrc, $iHeightSrc, $iRop)

    [/autoit] [autoit][/autoit] [autoit]

    Local $Ret = DllCall($hdll_gdi32, 'int', 'StretchBlt', 'hwnd', $hDestDC, 'int', $iXDest, 'int', $iYDest, 'int', $iWidthDest, 'int', $iHeightDest, 'hwnd', $hSrcDC, 'int', $iXSrc, 'int', $iYSrc, 'int', $iWidthSrc, 'int', $iHeightSrc, 'dword', $iRop)

    [/autoit] [autoit][/autoit] [autoit]

    If (@error) Or (Not $Ret[0]) Then
    Return SetError(1, 0, 0)
    EndIf
    Return 1
    EndFunc ;==>_WinAPI_StretchBlt

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func FensterMessen() ;==>MC wird Vermessen
    $MCpos = WinGetPos("Windows Media Center"); äussere koordinaten des media center abfragen
    If Not @error Then
    ;~ MsgBox(0, "", "x: " & $MCpos[0] & "y: " & $MCpos[1]); oben links...
    ;~ MsgBox(0, "", "breite: " & $MCpos[2] & "höhe: " & $MCpos[3]); unten rechts... vom media center
    Else
    MsgBox(16,"Fehler","Media Center Fenster nicht gefunden")
    $fehler = "Media Center Fenster nicht gefunden"

    [/autoit] [autoit][/autoit] [autoit]

    CLOSE_error()
    EndIf
    EndFunc ;==> FensterMessen()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func iniwrite_eingabe() ;==>werte werden in die datei geschrieben
    IniWrite($sFile, "widht", "widht", $widht)
    IniWrite($sFile, "height", "height", $height)
    IniWrite($sFile, "Qualität", "level", $ausg_quali)
    IniWrite($sFile, "Benutzer", "Name", $Name1)
    IniWrite($sFile, "System", "Name", $Name2)
    EndFunc ;==>iniwrite_eingabe

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func iniread_lesen() ;==werte werden aus der datei gelesen
    $widht=IniRead($sFile, "widht", "widht",1)
    $height=IniRead($sFile, "height", "height",1)
    $SCpos0=IniRead($sFile, "x", "x",1)
    $SCpos1=IniRead($sFile, "y", "y",1)
    $SCpos2=IniRead($sFile, "breite", "breite",1)
    $SCpos3=IniRead($sFile, "höhe", "höhe",1)
    $ausg_quali=IniRead($sFile, "Qualität", "level",1)
    $Name1 = IniRead($sFile, "Benutzer", "Name",1)
    $Name2 = IniRead($sFile, "System", "Name",1)
    EndFunc ;==> iniwrite_close

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func CLOSEClicked() ;==>gute nacht ;)
    $SCpos = WinGetPos("Desktop"); äussere koordinaten des media center abfragen
    If Not @error Then
    iniwrite_close()
    EndIf
    ;benutzte resourcen freigeben
    _WinAPI_ReleaseDC($hGUI, $hDC_GUI)
    _WinAPI_ReleaseDC($hDesktop, $hDC_Desktop)
    Exit
    EndFunc ;==>CLOSEClicked

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func iniwrite_close() ;==>werte für das aneigefenster werden in die datei geschrieben
    IniWrite($sFile, "x", "x", $SCpos[0])
    IniWrite($sFile, "y", "y", $SCpos[1])
    IniWrite($sFile, "breite", "breite", $SCpos[2])
    IniWrite($sFile, "höhe", "höhe", $SCpos[3])
    EndFunc ;==>iniwrite_close

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func CLOSE_error() ;==>abbruch mit fehlerausgabe
    FileOpen("fehler.txt",1); fehlerdatei öffnen oder erstellen
    FileWriteLine("fehler.txt",""& @MDAY&"."&@MON&"."&@YEAR&"_"&@HOUR&":"&@MIN&" "&$fehler&@CRLF); datum und zeit und fehler reinschreiben
    FileClose("fehler.txt")
    _WinAPI_ReleaseDC($hGUI, $hDC_GUI)
    _WinAPI_ReleaseDC($hDesktop, $hDC_Desktop)
    DllClose($hdll_gdi32)
    Exit
    EndFunc ;==>CLOSE_error

    [/autoit]

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.