Skip to content

v2.0.3.1713-legacy

Compare
Choose a tag to compare
@ALTaleX531 ALTaleX531 released this 24 Apr 21:28
· 41 commits to legacy since this release

What's Changed

Details

  • starting with this release, accent overrider will take effect for both blur and acrylic blur.
  • always use glass safe zones when accent overrider is enabled, even if no glass areas are detected, which would resolve #102.
  • the aero shader has been rolled back to use ps_4_0_level_9_3 to ensure compatibility
  • zero-copy rendering had stricter checks

Bonus

// ==WindhawkMod==
// @id              sxb-w7-shell-ui-accent-overrider
// @name            SXB Win7 Shell UI Accent Overrider
// @description     Override accent to dwm blur behind for sxb shell ui
// @version         1.1
// @author          ALTaleX
// @github          https://github.com/ALTaleX531
// @include         explorer.exe
// @compilerOptions -ldwmapi -lgdi32
// ==/WindhawkMod==

#include <windhawk_api.h>
#include <wingdi.h>
#include <winuser.h>
#include <dwmapi.h>

struct ACCENT_POLICY
{
    DWORD AccentState;
    DWORD AccentFlags;
    DWORD dwGradientColor;
    DWORD dwAnimationId;
};

enum WINDOWCOMPOSITIONATTRIBUTE
{
    WCA_ACCENT_POLICY = 19
};

struct WINDOWCOMPOSITIONATTRIBUTEDATA
{
    WINDOWCOMPOSITIONATTRIBUTE Attribute;
    PVOID pvData;
    SIZE_T cbData;
};

BOOL (WINAPI *pOriginalSetWindowCompositionAttribute)(HWND, const WINDOWCOMPOSITIONATTRIBUTEDATA*);
BOOL WINAPI SetWindowCompositionAttributeHook(HWND hWnd, const WINDOWCOMPOSITIONATTRIBUTEDATA* data)
{
    auto& accentPolicy = *reinterpret_cast<ACCENT_POLICY*>(data->pvData);

    if (
        data->Attribute != WCA_ACCENT_POLICY ||
        (
            RegisterWindowMessageW(L"DV2ControlHost") != GetClassWord(hWnd, GCW_ATOM) &&
            RegisterWindowMessageW(L"Shell_TrayWnd") != GetClassWord(hWnd, GCW_ATOM) &&
            RegisterWindowMessageW(L"Shell_SecondaryTrayWnd") != GetClassWord(hWnd, GCW_ATOM) &&
            RegisterWindowMessageW(L"SIBJumpView") != GetClassWord(hWnd, GCW_ATOM) &&
            (!GetModuleHandleW(L"StartAllBackX64.dll") || RegisterWindowMessageW(L"TaskListThumbnailWnd") != GetClassWord(hWnd, GCW_ATOM))
        )
    )
    {
        return pOriginalSetWindowCompositionAttribute(hWnd, data);
    }

    if (accentPolicy.AccentState == 1)
    {
        DWM_BLURBEHIND blurBehind
        { 
            .dwFlags = DWM_BB_ENABLE 
        };
        DwmEnableBlurBehindWindow(hWnd, &blurBehind);
        return pOriginalSetWindowCompositionAttribute(hWnd, data);
    }

    DWM_BLURBEHIND blurBehind
    {
        .dwFlags = DWM_BB_ENABLE,
        .fEnable = accentPolicy.AccentState != 0
    };
    DwmEnableBlurBehindWindow(hWnd, &blurBehind);
    
    ACCENT_POLICY replacedAccentPolicy{};
    WINDOWCOMPOSITIONATTRIBUTEDATA replacedData
    {
        .Attribute = WCA_ACCENT_POLICY,
        .pvData = &replacedAccentPolicy,
        .cbData = sizeof(replacedAccentPolicy)
    };
    return pOriginalSetWindowCompositionAttribute(hWnd, &replacedData);
}

decltype(&SetWindowRgn) pOriginalSetWindowRgn;
int WINAPI SetWindowRgnHook(HWND hWnd, HRGN hRgn, WINBOOL bRedraw)
{
    if (
        RegisterWindowMessageW(L"DV2ControlHost") != GetClassWord(hWnd, GCW_ATOM)
    )
    {
        return pOriginalSetWindowRgn(hWnd, hRgn, bRedraw);
    }

    ACCENT_POLICY accentPolicy{};
    WINDOWCOMPOSITIONATTRIBUTEDATA data
    {
        .Attribute = WCA_ACCENT_POLICY,
        .pvData = &accentPolicy,
        .cbData = sizeof(accentPolicy)
    };
    pOriginalSetWindowCompositionAttribute(hWnd, &data);

    return pOriginalSetWindowRgn(hWnd, hRgn, bRedraw);
}

HRESULT (WINAPI *pOriginalDwmpUpdateAccentBlurRect)(HWND, LPCRECT);
HRESULT WINAPI DwmpUpdateAccentBlurRectHook(HWND hWnd, LPCRECT lprc)
{
    if (
        RegisterWindowMessageW(L"TaskListThumbnailWnd") != GetClassWord(hWnd, GCW_ATOM) &&
        RegisterWindowMessageW(L"SIBJumpView") != GetClassWord(hWnd, GCW_ATOM)
    )
    {
        return pOriginalDwmpUpdateAccentBlurRect(hWnd, lprc);
    }
    
    ACCENT_POLICY accentPolicy{};
    WINDOWCOMPOSITIONATTRIBUTEDATA data
    {
        .Attribute = WCA_ACCENT_POLICY,
        .pvData = &accentPolicy,
        .cbData = sizeof(accentPolicy)
    };
    pOriginalSetWindowCompositionAttribute(hWnd, &data);

    HRESULT hr{ S_OK };
    DWM_BLURBEHIND blurBehind
    {
        .dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION,
        .fEnable = TRUE,
        .hRgnBlur = CreateRoundRectRgn(lprc->left, lprc->top, lprc->right, lprc->bottom + 2, 4, 4)
    };
    hr = DwmEnableBlurBehindWindow(hWnd, &blurBehind);
    DeleteObject(blurBehind.hRgnBlur);

    return hr;
}

// The mod is being initialized, load settings, hook functions, and do other
// initialization stuff if required.
BOOL Wh_ModInit() 
{
    Wh_Log(L"Init");

    pOriginalSetWindowCompositionAttribute = reinterpret_cast<decltype(pOriginalSetWindowCompositionAttribute)>(GetProcAddress(GetModuleHandleW(L"user32.dll"), "SetWindowCompositionAttribute"));
    pOriginalDwmpUpdateAccentBlurRect =  reinterpret_cast<decltype(pOriginalDwmpUpdateAccentBlurRect)>(GetProcAddress(GetModuleHandleW(L"dwmapi.dll"), MAKEINTRESOURCEA(159)));
    Wh_SetFunctionHook(reinterpret_cast<void*>(SetWindowRgn), reinterpret_cast<void*>(SetWindowRgnHook), reinterpret_cast<void**>(&pOriginalSetWindowRgn));
    Wh_SetFunctionHook(reinterpret_cast<void*>(pOriginalSetWindowCompositionAttribute), reinterpret_cast<void*>(SetWindowCompositionAttributeHook), reinterpret_cast<void**>(&pOriginalSetWindowCompositionAttribute));
    Wh_SetFunctionHook(reinterpret_cast<void*>(pOriginalDwmpUpdateAccentBlurRect), reinterpret_cast<void*>(DwmpUpdateAccentBlurRectHook), reinterpret_cast<void**>(&pOriginalDwmpUpdateAccentBlurRect));
    
    return TRUE;
}

void Wh_ModAfterInit()
{
    ACCENT_POLICY accentPolicy
    {
        .AccentState = 3
    };
    WINDOWCOMPOSITIONATTRIBUTEDATA data
    {
        .Attribute = WCA_ACCENT_POLICY,
        .pvData = &accentPolicy,
        .cbData = sizeof(accentPolicy)
    };
    if (const auto hWnd = FindWindowW(L"DV2ControlHost", nullptr); hWnd)
    {
        SetWindowCompositionAttributeHook(hWnd, &data);
    }
    if (const auto hWnd = FindWindowW(L"Shell_TrayWnd", nullptr); hWnd)
    {
        SetWindowCompositionAttributeHook(hWnd, &data);
    }
    if (const auto hWnd = FindWindowW(L"Shell_SecondaryTrayWnd", nullptr); hWnd)
    {
        SetWindowCompositionAttributeHook(hWnd, &data);
    }
    if (const auto hWnd = FindWindowW(L"TaskListThumbnailWnd", nullptr); hWnd)
    {
        SetWindowCompositionAttributeHook(hWnd, &data);
    }
}

// The mod is being unloaded, free all allocated resources.
void Wh_ModUninit() 
{
    Wh_Log(L"Uninit");

    ACCENT_POLICY accentPolicy
    {
        .AccentState = 4,
        .AccentFlags = 0x13,
        .dwGradientColor = 1
    };
    WINDOWCOMPOSITIONATTRIBUTEDATA data
    {
        .Attribute = WCA_ACCENT_POLICY,
        .pvData = &accentPolicy,
        .cbData = sizeof(accentPolicy)
    };
    DWM_BLURBEHIND blurBehind
    { 
        .dwFlags = DWM_BB_ENABLE 
    };
    if (const auto hWnd = FindWindowW(L"DV2ControlHost", nullptr); hWnd)
    {
        pOriginalSetWindowCompositionAttribute(hWnd, &data);
        DwmEnableBlurBehindWindow(hWnd, &blurBehind);
    }
    if (const auto hWnd = FindWindowW(L"Shell_TrayWnd", nullptr); hWnd)
    {
        pOriginalSetWindowCompositionAttribute(hWnd, &data);
        DwmEnableBlurBehindWindow(hWnd, &blurBehind);
    }
    if (const auto hWnd = FindWindowW(L"Shell_SecondaryTrayWnd", nullptr); hWnd)
    {
        pOriginalSetWindowCompositionAttribute(hWnd, &data);
        DwmEnableBlurBehindWindow(hWnd, &blurBehind);
    }
    if (const auto hWnd = FindWindowW(L"TaskListThumbnailWnd", nullptr); hWnd)
    {
        accentPolicy = 
        {
            .AccentState = 3,
            .AccentFlags = 0x200
        };
        data.pvData = &accentPolicy;
        pOriginalSetWindowCompositionAttribute(hWnd, &data);
        DwmEnableBlurBehindWindow(hWnd, &blurBehind);
    }
}

Full Changelog: v2.0.3.1702-legacy...v2.0.3.1713-legacy