Fensterfarbe ändern (Aero-Design)

  • Hi,

    ich würde gerne das, was man auf dem Desktop unter Anpassen > Fensterfarbe machen kann, mit AutoIt machen. Also die Farbe von allen Fenstern (die Titelleiste und der Rand) ändern.

    Ich habe leider noch keinen Eintrag in der Registry dazu gefunden. Nur wie man die Fensterfarbe ändern kann, wenn man Aero deaktiviert hat.

    Gibt es eine Möglichkeit das umzusetzen?

  • Hallo Luke4321,
    Die Werte (hexadezimal) für das Aero-Design liegen unter "HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM".
    Neben der Hauptfarbe sind dort noch weitere Werte für das Theme.
    Leider werden die Änderungen bei mir erst nach einem Neustart (oder nach dem Abmelden) sichtbar.
    Ich hoffe damit kann jemand etwas anfangen :)

    LG limond

  • Ah, schonmal vielen Dank dafür :).

    Nur das mit dem Neustarten ist natürlich blöd, aber irgendwie muss Windows das ja auch schaffen ohne Neustart. Also Process Monitor sagt, dass es scheinbar was mit "C:\Windows\System32\themecpl.dll", "C:\Windows\System32\shell32.dll" oder "C:\Windows\System32\ieframe.dll" zu tun haben muss.

    Ich kenne mich leider nicht damit aus daher hilft mir das auch nicht weiter :(

  • Mir war noch dieser Thread hier ins Auge gefallen:
    Windows 7 Aero Farbe ändern
    Die UDF aus Post 4 in dem Thread dort funktioniert bei mir leider nicht.

    Zudem habe ich auch noch diesen Code gefunden:

    Spoiler anzeigen
    [autoit]

    $GUI = GUICreate("Windows 7 DWM", 243, 243)
    $Apply = GUICtrlCreateButton("Apply", 80, 104, 83, 25, 0)
    GUISetState(@SW_SHOW)

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

    While 1
    $iMsg = GUIGetMsg()
    Switch $iMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Apply
    $Ret = ApplyGlass($GUI,243,243,243,243,0x000000); produces full glass window, the glass is red colored
    EndSwitch
    WEnd

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

    Func ApplyGlass($hWnd,$leftw,$rightw,$toph,$bottomh,$glasscolor = "0x000000")
    $struct=DllStructCreate("int cxLeftWidth;int cxRightWidth;int cyTopHeight;int cyBottomHeight;")
    DllStructSetData($struct,"cxLeftWidth",$leftw)
    DllStructSetData($struct,"cxRightWidth",$rightw)
    DllStructSetData($struct,"cyTopHeight",$toph)
    DllStructSetData($struct,"cyBottomHeight",$bottomh)
    GUISetBkColor($glasscolor)
    Return DllCall("dwmapi.dll", "int", "DwmExtendFrameIntoClientArea", "hwnd", $hWnd, "ptr", DllStructGetPtr($struct))
    EndFunc

    [/autoit]

    Dort kann man die Farbe vom Glas im Fenster ändern. Lässti sich das irgendwie auf's allgemeine übertragen?

  • Die Funktion von BugFix aus Post 4 funktioniert bei mir ohne jegliche Probleme (Win 7 x64). Die Farbe aller Fenster wird sofort auf den angegebenen Wert geändert, und die Rückgabe der aktuellen Farbe sowie das setzen der Transparenz geht auch.
    Sicher, dass du exakt diese Funktion hier verwendet hast?

    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ; Function Name....: _AeroColor_Set
    ; Description......: Ändert die Aero-Farbe oder fragt die aktuelle ab
    ; Parameter(s).....: $iColor die neue Farbe (RGB 0xFFFFFF), -1 (Standard) gibt die aktuelle Farbe zurück ohne Änderung
    ; $fTrans Transparenz aktivieren/deaktivieren, True=aktivieren (Standard)
    ; Return Value(s)..: Erfolg Der alte Farbwert bei Setzen eines neuen, bzw. mit Col=-1 der aktuelle Farbwert
    ; Fehler -1 @error des DllCalls ..Get
    ; -2 @error des DllCalls ..Set
    ; Author(s)........: BugFix ([email='bugfi@autoit.de'][/email])
    ;===============================================================================
    Func _AeroColor_Set($iColor=-1, $fTrans=True)
    Local $tDwmColorParams = DllStructCreate('uint;uint;uint;uint;uint;uint;bool;')
    Local $pDwmColorParams = DllStructGetPtr($tDwmColorParams)
    Local $ret, $iOldColor
    $ret = DllCall("dwmapi.dll", "int", 127, "ptr", $pDwmColorParams)
    If Not @error Then
    $iOldColor = DllStructGetData($tDwmColorParams, 1)
    Else
    Return SetError(@error,0,-1)
    EndIf
    If $iColor = -1 Then Return $iOldColor
    DllStructSetData($tDwmColorParams, 1, $iColor)
    DllStructSetData($tDwmColorParams, 7, Not $fTrans)
    $ret = DllCall("dwmapi.dll", "int", 131, "ptr", $pDwmColorParams, "bool", True)
    If Not @error Then
    Return $iOldColor
    Else
    Return SetError(@error,0,-2)
    EndIf
    EndFunc ;==>_AeroColor_Set

    [/autoit]


    Hast du überhaupt Windows 7? Ich könnte mir vorstellen, dass es z.B. bei Vista nicht geht.

  • Das wird dann wohl unter Vista nicht funktionieren.. Ich bin mir ziemlich sicher, dass das unter Vista auch irgendwie gehen muss. Aber leider bin ich mir nicht sicher wie...
    Die Registry kannst du aber vermutlich vergessen, da nur durch eine Bearbeitung des Wertes in der Registry Änderungen erst nach einem Neustrart/Neuanmeldung übernommen werden.
    Eventuell kann man die Funktion auch auf Vista umschreiben.