From e523a195b68599e30e1f101240d06ae6aea21446 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=81=8D=E5=85=AE=E6=83=9A=E5=85=AE?= <101191390+HIllya51@users.noreply.github.com> Date: Mon, 27 May 2024 16:29:22 +0800 Subject: [PATCH] arc --- LunaTranslator/LunaTranslator/gui/settin.py | 7 +- .../LunaTranslator/myutils/Acrylic.py | 151 ------------------ .../LunaTranslator/winsharedutils.py | 7 + plugins/winsharedutils/AreoAcrylic.cpp | 111 +++++++++++++ plugins/winsharedutils/CMakeLists.txt | 2 +- 5 files changed, 122 insertions(+), 156 deletions(-) delete mode 100644 LunaTranslator/LunaTranslator/myutils/Acrylic.py create mode 100644 plugins/winsharedutils/AreoAcrylic.cpp diff --git a/LunaTranslator/LunaTranslator/gui/settin.py b/LunaTranslator/LunaTranslator/gui/settin.py index 7e2e45c4..18c6912c 100644 --- a/LunaTranslator/LunaTranslator/gui/settin.py +++ b/LunaTranslator/LunaTranslator/gui/settin.py @@ -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"] diff --git a/LunaTranslator/LunaTranslator/myutils/Acrylic.py b/LunaTranslator/LunaTranslator/myutils/Acrylic.py deleted file mode 100644 index 1acad55f..00000000 --- a/LunaTranslator/LunaTranslator/myutils/Acrylic.py +++ /dev/null @@ -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)) diff --git a/LunaTranslator/LunaTranslator/winsharedutils.py b/LunaTranslator/LunaTranslator/winsharedutils.py index cc09c1f4..72b4b7e3 100644 --- a/LunaTranslator/LunaTranslator/winsharedutils.py +++ b/LunaTranslator/LunaTranslator/winsharedutils.py @@ -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,) diff --git a/plugins/winsharedutils/AreoAcrylic.cpp b/plugins/winsharedutils/AreoAcrylic.cpp new file mode 100644 index 00000000..a9d83fd8 --- /dev/null +++ b/plugins/winsharedutils/AreoAcrylic.cpp @@ -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); +} \ No newline at end of file diff --git a/plugins/winsharedutils/CMakeLists.txt b/plugins/winsharedutils/CMakeLists.txt index c0f40c1b..6ef747bf 100644 --- a/plugins/winsharedutils/CMakeLists.txt +++ b/plugins/winsharedutils/CMakeLists.txt @@ -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")