102 lines
2.7 KiB
C
102 lines
2.7 KiB
C
#pragma once
|
|
#include <windows.h>
|
|
|
|
enum AccentState {
|
|
ACCENT_DISABLED = 0,
|
|
ACCENT_ENABLE_GRADIENT = 1,
|
|
ACCENT_ENABLE_TRANSPARENTGRADIENT = 2,
|
|
ACCENT_ENABLE_BLURBEHIND = 3,
|
|
ACCENT_ENABLE_ACRYLICBLURBEHIND = 4,
|
|
ACCENT_ENABLE_HOSTBACKDROP = 5,
|
|
ACCENT_INVALID_STATE = 6
|
|
};
|
|
|
|
enum WindowCompositionAttribute {
|
|
WCA_ACCENT_POLICY = 19,
|
|
WCA_USEDARKMODECOLORS = 26
|
|
};
|
|
|
|
struct AccentPolicy {
|
|
AccentState accentState;
|
|
int accentFlags;
|
|
int gradientColor;
|
|
int animationId;
|
|
};
|
|
|
|
struct WindowCompositionAttributeData {
|
|
WindowCompositionAttribute attribute;
|
|
PVOID pData;
|
|
ULONG dataSize;
|
|
};
|
|
|
|
bool setBlur(HWND hWnd, AccentState accentState)
|
|
{
|
|
HKEY CurrentVersion;
|
|
auto result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_QUERY_VALUE, &CurrentVersion);
|
|
if (result == ERROR_SUCCESS)
|
|
{
|
|
DWORD DataSize = 32;
|
|
WCHAR* DataPtr = (WCHAR*)malloc(DataSize);
|
|
memset(DataPtr, 0, DataSize);
|
|
bool queryBuild = RegQueryValueEx(CurrentVersion, L"CurrentBuild", NULL, NULL, (LPBYTE)DataPtr, &DataSize) == ERROR_SUCCESS;
|
|
RegCloseKey(CurrentVersion);
|
|
if (queryBuild)
|
|
{
|
|
int BuildNum = _wtoi(DataPtr);
|
|
//MessageBox::Show(BuildNum.ToString());
|
|
if (BuildNum < 19042) return 0;
|
|
}
|
|
else return 0;
|
|
}
|
|
else return 0;
|
|
|
|
const HINSTANCE hModule_user32 = LoadLibrary(TEXT("user32.dll"));
|
|
if (hModule_user32)
|
|
{
|
|
typedef BOOL(WINAPI* p_SetWindowCompositionAttribute)(HWND, WindowCompositionAttributeData*);
|
|
|
|
const p_SetWindowCompositionAttribute SetWindowCompositionAttribute = (p_SetWindowCompositionAttribute)GetProcAddress(hModule_user32, "SetWindowCompositionAttribute");
|
|
|
|
bool result = false;
|
|
|
|
if (SetWindowCompositionAttribute)
|
|
{
|
|
AccentPolicy policy;
|
|
policy.accentState = accentState;
|
|
policy.accentFlags = 2;
|
|
policy.gradientColor = 0x01000000;
|
|
policy.animationId = 0;
|
|
|
|
WindowCompositionAttributeData data;
|
|
data.attribute = WCA_ACCENT_POLICY;
|
|
data.pData = &policy;
|
|
data.dataSize = sizeof(AccentPolicy);
|
|
|
|
result = SetWindowCompositionAttribute(hWnd, &data);
|
|
}
|
|
FreeLibrary(hModule_user32);
|
|
|
|
return result;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void setDarkTheme(HWND hWnd, bool dark=true)
|
|
{
|
|
const HINSTANCE hModule_dwmapi = LoadLibrary(TEXT("dwmapi.dll"));
|
|
if (hModule_dwmapi)
|
|
{
|
|
typedef BOOL(WINAPI* p_DwmSetWindowAttribute)(HWND, DWORD, LPCVOID, DWORD);
|
|
const p_DwmSetWindowAttribute DwmSetWindowAttribute = (p_DwmSetWindowAttribute)GetProcAddress(hModule_dwmapi, "DwmSetWindowAttribute");
|
|
|
|
if (DwmSetWindowAttribute)
|
|
{
|
|
LONG useDarkModeColors = dark;
|
|
if(DwmSetWindowAttribute(hWnd, 20, &useDarkModeColors, sizeof(useDarkModeColors)))
|
|
DwmSetWindowAttribute(hWnd, 19, &useDarkModeColors, sizeof(useDarkModeColors));
|
|
}
|
|
FreeLibrary(hModule_dwmapi);
|
|
}
|
|
}
|