v2.0.3.1713-legacy
·
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