This commit is contained in:
恍兮惚兮 2024-05-27 16:29:22 +08:00
parent ccd47e6dc9
commit e523a195b6
5 changed files with 122 additions and 156 deletions

View File

@ -32,7 +32,6 @@ from gui.setting_proxy import setTab_proxy
from gui.settingpage7 import setTab7, settab7direct
from gui.settingpage_about import setTab_about, setTab_about_dicrect
from gui.usefulwidget import closeashidewindow, tabadd_lazy
from myutils.Acrylic import WindowEffect
class gridwidget(QWidget):
@ -261,11 +260,11 @@ class Settin(closeashidewindow):
for widget in QApplication.topLevelWidgets():
if widget.testAttribute(Qt.WA_TranslucentBackground):
if globalconfig["WindowEffect"] == 0:
WindowEffect().clear(int(widget.winId()))
winsharedutils.clearEffect(int(widget.winId()))
elif globalconfig["WindowEffect"] == 1:
WindowEffect().setAcrylicEffect(int(widget.winId()))
winsharedutils.setAcrylicEffect(int(widget.winId()))
elif globalconfig["WindowEffect"] == 2:
WindowEffect().setAeroEffect(int(widget.winId()))
winsharedutils.setAeroEffect(int(widget.winId()))
continue
winsharedutils.SetTheme(
int(widget.winId()), dark, globalconfig["WindowBackdrop"]

View File

@ -1,151 +0,0 @@
# coding:utf-8
from ctypes import POINTER, Structure
from ctypes.wintypes import DWORD, HWND, ULONG
from enum import Enum
# coding:utf-8
from ctypes import POINTER, c_bool, sizeof, windll, pointer, c_int
from ctypes.wintypes import DWORD, HWND, ULONG
class WINDOWCOMPOSITIONATTRIB(Enum):
WCA_UNDEFINED = (0,)
WCA_NCRENDERING_ENABLED = (1,)
WCA_NCRENDERING_POLICY = (2,)
WCA_TRANSITIONS_FORCEDISABLED = (3,)
WCA_ALLOW_NCPAINT = (4,)
WCA_CAPTION_BUTTON_BOUNDS = (5,)
WCA_NONCLIENT_RTL_LAYOUT = (6,)
WCA_FORCE_ICONIC_REPRESENTATION = (7,)
WCA_EXTENDED_FRAME_BOUNDS = (8,)
WCA_HAS_ICONIC_BITMAP = (9,)
WCA_THEME_ATTRIBUTES = (10,)
WCA_NCRENDERING_EXILED = (11,)
WCA_NCADORNMENTINFO = (12,)
WCA_EXCLUDED_FROM_LIVEPREVIEW = (13,)
WCA_VIDEO_OVERLAY_ACTIVE = (14,)
WCA_FORCE_ACTIVEWINDOW_APPEARANCE = (15,)
WCA_DISALLOW_PEEK = (16,)
WCA_CLOAK = (17,)
WCA_CLOAKED = (18,)
WCA_ACCENT_POLICY = (19,)
WCA_FREEZE_REPRESENTATION = (20,)
WCA_EVER_UNCLOAKED = (21,)
WCA_VISUAL_OWNER = (22,)
WCA_LAST = 23
class ACCENT_STATE(Enum):
"""客户区状态枚举类"""
ACCENT_DISABLED = (0,)
ACCENT_ENABLE_GRADIENT = (1,)
ACCENT_ENABLE_TRANSPARENTGRADIENT = (2,)
ACCENT_ENABLE_BLURBEHIND = (3,) # Aero效果
ACCENT_ENABLE_ACRYLICBLURBEHIND = (4,) # 亚克力效果
ACCENT_INVALID_STATE = 5
class ACCENT_POLICY(Structure):
"""设置客户区的具体属性"""
_fields_ = [
("AccentState", DWORD),
("AccentFlags", DWORD),
("GradientColor", DWORD),
("AnimationId", DWORD),
]
class WINDOWCOMPOSITIONATTRIBDATA(Structure):
_fields_ = [
("Attribute", DWORD),
(
"Data",
POINTER(ACCENT_POLICY),
), # POINTER()接收任何ctypes类型并返回一个指针类型
("SizeOfData", ULONG),
]
class WindowEffect:
"""调用windows api实现窗口效果"""
def __init__(self):
# 调用api
self.SetWindowCompositionAttribute = windll.user32.SetWindowCompositionAttribute
self.SetWindowCompositionAttribute.restype = c_bool
self.SetWindowCompositionAttribute.argtypes = [
c_int,
POINTER(WINDOWCOMPOSITIONATTRIBDATA),
]
# 初始化结构体
self.accentPolicy = ACCENT_POLICY()
self.winCompAttrData = WINDOWCOMPOSITIONATTRIBDATA()
self.winCompAttrData.Attribute = (
WINDOWCOMPOSITIONATTRIB.WCA_ACCENT_POLICY.value[0]
)
self.winCompAttrData.SizeOfData = sizeof(self.accentPolicy)
self.winCompAttrData.Data = pointer(self.accentPolicy)
def clear(self, hWnd):
self.accentPolicy.AccentState = ACCENT_STATE.ACCENT_DISABLED.value[0]
self.SetWindowCompositionAttribute(hWnd, pointer(self.winCompAttrData))
def setAcrylicEffect(
self,
hWnd: int,
gradientColor: str = "F2F2F230",
isEnableShadow: bool = True,
animationId: int = 0,
):
"""开启亚克力效果
Parameters
----------
hWnd: int
窗口句柄
gradientColor: str
十六进制亚克力混合色对应 RGBA 四个分量
isEnableShadow: bool
是否启用窗口阴影
animationId: int
控制磨砂动画
"""
# 亚克力混合色
gradientColor = (
gradientColor[6:]
+ gradientColor[4:6]
+ gradientColor[2:4]
+ gradientColor[:2]
)
gradientColor = DWORD(int(gradientColor, base=16))
# 磨砂动画
animationId = DWORD(animationId)
# 窗口阴影
accentFlags = DWORD(0x20 | 0x40 | 0x80 | 0x100) if isEnableShadow else DWORD(0)
self.accentPolicy.AccentState = (
ACCENT_STATE.ACCENT_ENABLE_ACRYLICBLURBEHIND.value[0]
)
self.accentPolicy.GradientColor = gradientColor
self.accentPolicy.AccentFlags = accentFlags
self.accentPolicy.AnimationId = animationId
# 开启亚克力
self.SetWindowCompositionAttribute(hWnd, pointer(self.winCompAttrData))
def setAeroEffect(self, hWnd: int):
"""开启 Aero 效果
Parameter
----------
hWnd: int
窗口句柄
"""
self.accentPolicy.AccentState = ACCENT_STATE.ACCENT_ENABLE_BLURBEHIND.value[0]
# 开启Aero
self.SetWindowCompositionAttribute(hWnd, pointer(self.winCompAttrData))

View File

@ -382,3 +382,10 @@ def gdi_screenshot(x1, y1, x2, y2, hwnd=None):
maximum_window = utilsdll.maximum_window
maximum_window.argtypes = (HWND,)
setAeroEffect = utilsdll.setAeroEffect
setAeroEffect.argtypes = (HWND,)
setAcrylicEffect = utilsdll.setAcrylicEffect
setAcrylicEffect.argtypes = (HWND,)
clearEffect = utilsdll.clearEffect
clearEffect.argtypes = (HWND,)

View File

@ -0,0 +1,111 @@
#include "define.h"
typedef enum _WINDOWCOMPOSITIONATTRIB
{
CA_UNDEFINED = 0,
WCA_NCRENDERING_ENABLED = 1,
WCA_NCRENDERING_POLICY = 2,
WCA_TRANSITIONS_FORCEDISABLED = 3,
WCA_ALLOW_NCPAINT = 4,
WCA_CAPTION_BUTTON_BOUNDS = 5,
WCA_NONCLIENT_RTL_LAYOUT = 6,
WCA_FORCE_ICONIC_REPRESENTATION = 7,
WCA_EXTENDED_FRAME_BOUNDS = 8,
WCA_HAS_ICONIC_BITMAP = 9,
WCA_THEME_ATTRIBUTES = 10,
WCA_NCRENDERING_EXILED = 11,
WCA_NCADORNMENTINFO = 12,
WCA_EXCLUDED_FROM_LIVEPREVIEW = 13,
WCA_VIDEO_OVERLAY_ACTIVE = 14,
WCA_FORCE_ACTIVEWINDOW_APPEARANCE = 15,
WCA_DISALLOW_PEEK = 16,
WCA_CLOAK = 17,
WCA_CLOAKED = 18,
WCA_ACCENT_POLICY = 19,//
WCA_FREEZE_REPRESENTATION = 20,
WCA_EVER_UNCLOAKED = 21,
WCA_VISUAL_OWNER = 22,
WCA_LAST = 23
} WINDOWCOMPOSITIONATTRIB;
typedef struct _WINDOWCOMPOSITIONATTRIBDATA
{
WINDOWCOMPOSITIONATTRIB Attrib;
PVOID pvData;
SIZE_T cbData;
} WINDOWCOMPOSITIONATTRIBDATA;
typedef enum _ACCENT_STATE
{
ACCENT_DISABLED = 0,
ACCENT_ENABLE_GRADIENT = 1,
ACCENT_ENABLE_TRANSPARENTGRADIENT = 2,
ACCENT_ENABLE_BLURBEHIND = 3,
ACCENT_ENABLE_ACRYLICBLURBEHIND = 4,
ACCENT_INVALID_STATE=5
} ACCENT_STATE;
typedef struct _ACCENT_POLICY
{
ACCENT_STATE AccentState;
DWORD AccentFlags;
DWORD GradientColor;
DWORD AnimationId;
} ACCENT_POLICY;
WINUSERAPI
BOOL
WINAPI
GetWindowCompositionAttribute(
_In_ HWND hWnd,
_Inout_ WINDOWCOMPOSITIONATTRIBDATA* pAttrData);
typedef BOOL(WINAPI* pfnGetWindowCompositionAttribute)(HWND, WINDOWCOMPOSITIONATTRIBDATA*);
WINUSERAPI
BOOL
WINAPI
SetWindowCompositionAttribute(
_In_ HWND hWnd,
_Inout_ WINDOWCOMPOSITIONATTRIBDATA* pAttrData);
typedef BOOL(WINAPI* pfnSetWindowCompositionAttribute)(HWND, WINDOWCOMPOSITIONATTRIBDATA*);
#define common ACCENT_POLICY accentPolicy;\
WINDOWCOMPOSITIONATTRIBDATA winCompAttrData;\
ZeroMemory(&accentPolicy,sizeof(accentPolicy));\
ZeroMemory(&winCompAttrData,sizeof(winCompAttrData));\
winCompAttrData.Attrib = WCA_ACCENT_POLICY;\
winCompAttrData.cbData = sizeof(accentPolicy);\
winCompAttrData.pvData = &accentPolicy;\
auto setWindowCompositionAttribute = (pfnSetWindowCompositionAttribute)GetProcAddress(GetModuleHandle(L"user32.dll"), "SetWindowCompositionAttribute");\
if(!setWindowCompositionAttribute)return false;
DECLARE bool setAcrylicEffect(HWND hwnd){
DWORD gradientColor=0x30F2F2F2;//ABGR
bool isEnableShadow=true;
DWORD animationId= 0;
auto accentFlags = isEnableShadow?(DWORD(0x20 | 0x40 | 0x80 | 0x100)):0;
common
accentPolicy.AccentState =ACCENT_ENABLE_ACRYLICBLURBEHIND;
accentPolicy.GradientColor = gradientColor;
accentPolicy.AccentFlags = accentFlags;
accentPolicy.AnimationId = animationId;
return setWindowCompositionAttribute(hwnd,&winCompAttrData);
}
DECLARE bool setAeroEffect(HWND hwnd){
common
accentPolicy.AccentState =ACCENT_ENABLE_BLURBEHIND;
return setWindowCompositionAttribute(hwnd,&winCompAttrData);
}
DECLARE bool clearEffect(HWND hwnd){
common
accentPolicy.AccentState =ACCENT_DISABLED;
return setWindowCompositionAttribute(hwnd,&winCompAttrData);
}

View File

@ -11,7 +11,7 @@ generate_product_version(
VERSION_PATCH ${VERSION_PATCH}
)
add_library(winsharedutils MODULE screenshot.cpp audio.cpp ../implsapi.cpp hwnd.cpp darklistener.cpp theme.cpp version.cpp otsu.cpp cinterface.cpp clipboard.cpp lnk.cpp dllmain.cpp levenshtein.cpp muteprocess.cpp sapi_dll.cpp simplemecab.cpp SimpleBrowser.cpp MWebBrowser.cpp icon.cpp maglistener.cpp ${versioninfo})
add_library(winsharedutils MODULE AreoAcrylic.cpp screenshot.cpp audio.cpp ../implsapi.cpp hwnd.cpp darklistener.cpp theme.cpp version.cpp otsu.cpp cinterface.cpp clipboard.cpp lnk.cpp dllmain.cpp levenshtein.cpp muteprocess.cpp sapi_dll.cpp simplemecab.cpp SimpleBrowser.cpp MWebBrowser.cpp icon.cpp maglistener.cpp ${versioninfo})
target_precompile_headers(winsharedutils REUSE_FROM pch)
if(${CMAKE_SIZEOF_VOID_P} EQUAL 8)
set_target_properties(winsharedutils PROPERTIES OUTPUT_NAME "winsharedutils64")