GUI vor grauem Hintergrund

    • Offizieller Beitrag

    Hallo,

    ich habe mal ein Script geschrieben bei dem eine GUI vor einem sich graufärbenden Hintergrund befinden. Dabei wird einfach von dem aktuellen Bildschirminhalt ein Snapshot gemacht und als Hintergrund gesetzt. Dieser Hintergrund wird dann schrittweise eingegraut. Wenn die GUI beendet wird, wird der Hintergrund schrittweise wieder eingefärbt.

    Die Schrittweite für das Eingrauen und Einfärben kann seperat mit den Variablen $iGrayStep und $iColorStep eingestellt werden.

    Die GUI $hGUIforGrayBK kann an die eingenen Bedürfnisse angepasst werden.

    Zum kompilieren wird noch die Auto3Lib von Paul Campbell benötigt.

    Edit:
    Jetzt wird der gesamte Bereich eingegraut, auch bei mehr als einem Monitor!

    Spoiler anzeigen
    [autoit]

    #include <A3LGDIPlus.au3>
    #include <A3LScreenCap.au3>

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

    HotKeySet("!{TAB}", "NoAltTab") ; Alt-Tab verhindern
    HotKeySet("+!{TAB}", "NoAltTab") ; Shift-alt-Tab verhindern

    Global const $tagCOLORADJUSTMENT = "ushort caSize;ushort caFlags;ushort caIlluminantIndex;ushort caRedGamma;" & _
    "ushort caGreenGamma;ushort caBlueGamma;ushort caReferenceBlack;ushort caReferenceWhite;" & _
    "short caContrast;short caBrightness;short caColorfulness;short caRedGreenTint;"

    Global Const $BLACKONWHITE = 1
    Global Const $WHITEONBLACK = 2
    Global Const $COLORONCOLOR = 3
    Global Const $HALFTONE = 4
    Global Const $MAXSTRETCHBLTMODE = 4
    Global Const $STRETCH_ANDSCANS = $BLACKONWHITE
    Global Const $STRETCH_ORSCANS = $WHITEONBLACK
    Global Const $STRETCH_DELETESCANS = $COLORONCOLOR
    Global Const $STRETCH_HALFTONE = $HALFTONE

    Global Const $cszFileName = @TempDir & "\$$" & @YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC & "$$.jpg"

    Global Const $iGrayStep = 2 ; Schrittweite fürs eingrauen
    Global Const $iColorStep = 10 ; Schrittweite fürs einfärben

    Global $hBMP, $hGUIDskTop, $hImage, $iSaturation, $hGUIforGrayBK

    Global $hDllGdi32 = DllOpen("gdi32.dll")

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

    Global $VirtualDskTop = GetVirtualScreenSize()

    $hBMP = _ScreenCap_Capture($cszFileName, 0, 0, $VirtualDskTop[0], $VirtualDskTop[1], False)

    #region An diesem Fenster keine Änderungen vornehmen
    $hGUIDskTop = GUICreate("", $VirtualDskTop[0], $VirtualDskTop[1], 0, 0, -1, BitOR($WS_EX_TOPMOST, $WS_EX_LAYERED))
    GUISetState()
    WinSetOnTop($hGUIDskTop, "", 1 )
    #endregion

    _GDIP_Startup ()

    $hImage = _GDIP_ImageLoadFromFile($cszFileName)

    $iSaturation = 0 ; Farbsättigung, mögliche Werte von -100 (Grau) bis 100 (Farbe); Standard 0
    SaturationBitmap($hGUIDskTop,$hImage,$iSaturation) ; Hintergrund beim 1. mal normal malen

    #region Dieses Fenster nach eigenen Bedürfnissen anpassen
    ; !!! Achtung den Namen ($hGUIforGrayBK) und den parent-Parameter ($hGUIDskTop) nicht ändern !!!
    $hGUIforGrayBK = GUICreate("Fenster vor grauen Hintergrund", 500, 200, -1, -1, BitOR($WS_SYSMENU, $WS_DLGFRAME), -1, $hGUIDskTop)
    Local $lblInfo = GUICtrlCreateLabel("Diesen Fenster wird vor einem, sich" & @CRLF & "eingrauenden, Hintergund angezeigt.",15,20, 470, 120)
    GUICtrlSetFont(-1,16)
    Local $ButOK = GUICtrlCreateButton("OK",210,150,80,25)
    GUISetState()
    #endregion
    WinSetOnTop($hGUIforGrayBK, "", 1 )

    While 1
    ; Hintergrund eingrauen
    If $iSaturation > -100 Then
    $iSaturation -= Abs($iGrayStep)
    If $iSaturation < -100 Then $iSaturation = -100
    SaturationBitmap($hGUIDskTop,$hImage,$iSaturation)
    Endif

    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop

    Case $ButOK
    ExitLoop

    EndSwitch
    WEnd

    GUISetState(@SW_HIDE,$hGUIforGrayBK)

    ; Hintergrund wieder einfärben
    While $iSaturation < 0
    $iSaturation += Abs($iColorStep)
    If $iSaturation > 0 Then $iSaturation = 0
    SaturationBitmap($hGUIDskTop,$hImage,$iSaturation)
    Wend

    _GDIP_Shutdown ()

    If $hDllGdi32 > 0 Then DllClose($hDllGdi32)

    FileDelete($cszFileName)

    ; + ----------------------------------------------------- +
    ; | Funktionen aus gdi32.dll |
    ; + ----------------------------------------------------- +
    Func _GDI32_GetColorAdjustment($hDC)
    Local $aResult
    Local $tData = DllStructCreate($tagCOLORADJUSTMENT)
    Local $pData = DllStructGetPtr($tData)

    $aResult = DllCall($hDllGdi32, "int", "GetColorAdjustment", "hwnd", $hDC, "ptr", $pData)

    Return SetError(1 * ($aResult[0] = 0), 0, $tData)
    EndFunc

    Func _GDI32_SetColorAdjustment($hDC, $tData)
    Local $aResult
    Local $pData = DllStructGetPtr($tData)

    $aResult = DllCall($hDllGdi32, "int", "SetColorAdjustment", "hwnd", $hDC, "ptr", $pData)

    Return SetError(1 * ($aResult[0] = 0), 0, $tData)
    EndFunc

    Func _GDI32_SetStretchBltMode($hDC, $iStretchMode)
    Local $aResult

    $aResult = DllCall($hDllGdi32, "int", "SetStretchBltMode", "hwnd", $hDC, "int", $iStretchMode)

    Return SetError(1 * ($aResult[0] = 0), 0, $aResult[0])
    EndFunc

    Func _GDI32_StretchBlt($hdcDest,$nXOriginDest,$nYOriginDest,$nWidthDest,$nHeightDest,$hdcSrc,$nXOriginSrc,$nYOriginSrc,$nWidthSrc,$nHeightSrc,$dwRop)
    Local $aResult

    $aResult = DllCall($hDllGdi32, "int", "StretchBlt", _
    "hwnd", $hdcDest, _
    "int", $nXOriginDest, _
    "int", $nYOriginDest, _
    "int", $nWidthDest, _
    "int", $nHeightDest, _
    "hwnd", $hdcSrc, _
    "int", $nXOriginSrc, _
    "int", $nYOriginSrc, _
    "int", $nWidthSrc, _
    "int", $nHeightSrc, _
    "dword", $dwRop _
    )

    Return SetError(1 * ($aResult[0] = 0), 0, ($aResult[0] = 1))
    EndFunc

    Func SaturationBitmap($hGUI, $hImage, $iSaturation)
    Local $hScrDC, $hMemDC, $hBitmap, $hOldBitmap, $pSize, $tSize, $pSource, $tSource, $tCA

    $hScrDC = _API_GetDC(0)
    $hMemDC = _API_CreateCompatibleDC($hScrDC)
    $hBitmap = _GDIP_BitmapCreateHBITMAPFromBitmap($hImage)
    $hOldBitmap = _API_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize )
    DllStructSetData($tSize, "X", _GDIP_ImageGetWidth ($hImage))
    DllStructSetData($tSize, "Y", _GDIP_ImageGetHeight($hImage))
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)

    _GDI32_SetStretchBltMode($hMemDC,$HALFTONE)

    $tCA = _GDI32_GetColorAdjustment($hMemDC)
    DllStructSetData($tCA,"caColorfulness",$iSaturation)
    _GDI32_SetColorAdjustment($hMemDC,$tCA)
    _GDI32_StretchBlt($hMemDC,0,0,$VirtualDskTop[0],$VirtualDskTop[1],$hMemDC,0,0,$VirtualDskTop[0],$VirtualDskTop[1],$SRCCOPY)

    _API_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, 0, 0)
    _API_ReleaseDC (0, $hScrDC)
    _API_SelectObject($hMemDC, $hOldBitmap)
    _API_DeleteObject($hBitmap)
    _API_DeleteDC ($hMemDC)
    EndFunc

    Func NoAltTab()
    ; Pseudofunktion um den Hotkey
    ; Alt-Tab zu verhindern
    EndFunc

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

    Func GetVirtualScreenSize()
    Local $aVSS[2] = [0, 0]

    $aVSS[0] = _API_GetSystemMetrics($SM_CXVIRTUALSCREEN)
    $aVSS[1] = _API_GetSystemMetrics($SM_CYVIRTUALSCREEN)

    If ($aVSS[0] = 0) Or ($aVSS[1] = 0) Then
    $aVSS[0] = 0
    $aVSS[1] = 0
    EndIf

    Return SetError(($aVSS[0] Or $aVSS[1]),0, $aVSS)
    EndFunc

    [/autoit]
  • O_O

    geil ...

    *anfang einen fakeshutdown zu programmieren :P*

    Dieser Beitrag wurde 9521 mal editiert, zum letzten Mal von Blubkuh: Morgen, 02:28.

    [autoit]

    If Not $Elephant Then $Irelephant = True

    [/autoit]
    • Offizieller Beitrag

    HI,

    hier sowas ähnliches mit Prospeed.

    Spoiler anzeigen
    [autoit]

    #include <prospeed.au3>
    #include <GUIConstants.au3>
    $r = GUICreate("My GUI", 400, 200, 300, 300)
    $b = GUICtrlCreateButton("close", 10, 10, 100, 30)
    GUISetState(@SW_SHOW)

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

    WinSetOnTop("My GUI", "", 1)
    ; Run the GUI until the dialog is closed
    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    If $msg = $b Then
    $gui = _GreyBackground(0, 1, 0)
    Sleep(500)
    Exit (0)
    EndIf
    WEnd

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

    Func _GreyBackground($iBlur = 0, $iFade = 0, $onTop = 1)
    ControlFocus("Program Manager", "", "SysListView321")
    ScreenShot (@ScriptDir & "\Desktop.jpg", @DesktopWidth, @DesktopHeight, 0, 0, 1)
    Local $iGui = GUICreate("Prospeed", @DesktopWidth, @DesktopHeight, 0, 0, -2147483648, 128);$WS_POPUP, $WS_EX_TOOLWINDOW
    If $onTop Then WinSetOnTop($iGui, "", 1)
    WinSetTrans($iGui, "", 1)
    GUISetState()
    $dsktop = LoadImage (@ScriptDir & "\Desktop.jpg", 0, 0, @DesktopWidth, @DesktopHeight, 0)
    Grey ($dsktop, 0, 0, 1)
    If $iFade Then
    For $i = 1 To 255 Step 5
    WinSetTrans($iGui, "", $i)
    Next
    WinSetTrans($iGui, "", 255)
    Else
    WinSetTrans($iGui, "", 255)
    EndIf

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

    If $iBlur Then blur ($dsktop, 0, 0, 30, 1)
    Return $iGui
    EndFunc ;==>_GreyBackground

    [/autoit]

    So long,

    Mega

  • Hallo.

    Wo muß ich die [Auto3Lib] hincopieren. Ich meine in welchen Ordner?

    LG Lina

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Hallo GTA.

    Habe mir den Download herunter gesaugt und angeklickt, aber er sagt ihrend etwas von Fehler.

    Gibt es den auch ohne Installer und das man ihn dann in den richtigen Ordner kopieren kann?

    LG Lina

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Kann ich Dir jetzt gar nicht sagen.
    Habe es wieder gelöscht und warte mal, ob eine andere Lsöung zu finden ist.

    Werde mich jetzt weiter daran machen, hier am neuen Arbeitsplatz zahlreiche Sachen, DANK AUTOIT, zu automatisieren.

    Bin schon die zweite Woche dabei und es geht schon ganz gut, solange ich die ausgedruckte PDF-Hilfe habe.

    Seit alle ganz lieb gegrüßt.

    Lina

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • durch drücken der windows taste kann man den grauen bildschirm umgehen. kann man das auch noch rausfiltern? :)

    Dieser Beitrag wurde 9521 mal editiert, zum letzten Mal von Blubkuh: Morgen, 02:28.

    [autoit]

    If Not $Elephant Then $Irelephant = True

    [/autoit]