Windows 7 Aero Farbe ändern

  • Hallo Leute,
    ich versuche grade die Funktion "_DwmpSetColorizationParameters" der dwmapi.dll in Autoit zu schreiben,
    da das jedoch mein erstes mal mit DLLs ist habe ich einige Probleme^^.


    Folgende Infos habe ich gefunden:


    Infos über die Struktur:


    Autohotkey Code:

    Daraus habe ich jetzt folgenden Code gemacht: #mce_temp_url#


    Leider passiert beim ausführen garnichts^^

    Hoffe das mir jemand helfen kann

    MfG Sumsum

    Einmal editiert, zuletzt von sumsum (28. März 2011 um 13:56)

    • Offizieller Beitrag

    Hab nur mal kurz draufgeschaut: Du verwendest in deiner Struktur als Alias der Parameter var1, var2... - Wie kommst du dadrauf? Die heißen doch: nIntensity usw.
    Entweder verwendest du die Original Parameternamen oder läßt sie ganz weg. Du kannst also die Struktur nur aus den Datentypen (ohne Aliasnamen) erstellen.
    Auch stimmen deine Datentypen nicht: der letzte ist BOOL und die ersten beiden sind die Struktur COLORREF - wie die aussieht mußt du mal suchen.

    Edit: Hab mal kurz gesucht und eine andere Umsetzung gefunden. Hier werden die Parameter deutlicher: s. hier

    • Offizieller Beitrag

    Also ich habe das mal kurz erstellt:

    Spoiler anzeigen
    [autoit]

    Local $tDwmColorParams = DllStructCreate('uint;uint;uint;uint;uint;uint;bool;')
    Local $pDwmColorParams = DllStructGetPtr($tDwmColorParams)
    Local $ret = DllCall("dwmapi.dll", "int", "DwmpGetColorizationParameters", "ptr", $pDwmColorParams)
    If Not @error Then
    ConsoleWrite(DllStructGetData($tDwmColorParams, 1) & @CRLF)
    Else
    ConsoleWrite('@error: ' & @error & @CRLF)
    EndIf

    [/autoit]


    Ich bekomme @error = 3 ==> Funktion nicht gefunden.
    Daraufhin habe ich mir die Dll mal mit DependencyWalker angesehen - sie beinhaltet weder eine Funktion "DwmpGetColorizationParameters" noch "DwmpSetColorizationParameters". Dann kann der Aufruf so natürlich nicht erfolgreich sein.
    Bleibt noch der Versuch mit der Ordinalnummer die Funktion aufzurufen.
    Und siehe da, das funzt ;)

    Spoiler anzeigen
    [autoit]


    Local $tDwmColorParams = DllStructCreate('uint;uint;uint;uint;uint;uint;bool;')
    Local $pDwmColorParams = DllStructGetPtr($tDwmColorParams)
    Local $ret = DllCall("dwmapi.dll", "int", 127, "ptr", $pDwmColorParams)
    If Not @error Then
    Local $col = DllStructGetData($tDwmColorParams, 1)
    Local $blau = BitAND(BitShift($col, 16), 255)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $blau = ' & $blau & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    Local $gruen = BitAND(BitShift($col, 8), 255)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $gruen = ' & $gruen & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    Local $rot = BitAND($col, 255)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $rot = ' & $rot & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    Else
    ConsoleWrite('@error: ' & @error & @CRLF)
    EndIf

    [/autoit]


    Analog mußt du mit der Set-Funktion umgehen.


    Edit2:
    Ich hab das mal in eine Funktion gepackt:
    - True/False für Transparenz war falsch, korrigiert - Aufruf bleibt wie gehabt

    >_AeroColor_Set
    [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]


    Ich hab mal noch probiert: Parameter 3 scheint die Helligkeit zu sein, je kleiner desto heller. Bei 4 und 5 sehe ich keine Änderungen, 6 ist evtl die Sättigung - aber das ist auch nur zu ahnen.

    • Offizieller Beitrag

    Liest du überhaupt meine Postings? :S
    Post #4, 2.ter Spoiler, da werte ich die Farbe aus.
    Ansonsten einfach:

    [autoit]

    ConsoleWrite( "0x" & Hex($retColor, 6) & @CRLF )

    [/autoit]


    AutoIt schreibt dir die Hex-Zahl sonst als Dezimalwert, daher diese lange Zahl.

    • Offizieller Beitrag

    bei mir bewirkt das setzten der Tranzparenz genau das gegenteil True=deaktiviert und false=Aktiviert.


    Ahh, mein Fehler - habe die Beschreibung falsch gelesen. Ist ja eigentlich auch etwas widersinnig, mit True die Transparenz abzuschalten. ;)
    Ich ändere das einfach in der Funktion so, dass True zu Transparenz Ein wird.