0710更新
parent
1eb5e3f2d3
commit
1ff43e4347
@ -1,2 +0,0 @@
|
||||
from .window_effect import WindowEffect
|
||||
from .c_structures import *
|
@ -1,135 +0,0 @@
|
||||
# coding:utf-8
|
||||
|
||||
from ctypes import POINTER, Structure, c_int
|
||||
from ctypes.wintypes import DWORD, HWND, ULONG, POINT, RECT, UINT
|
||||
from enum import Enum
|
||||
|
||||
|
||||
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):
|
||||
""" Client area status enumeration class """
|
||||
ACCENT_DISABLED = 0
|
||||
ACCENT_ENABLE_GRADIENT = 1
|
||||
ACCENT_ENABLE_TRANSPARENTGRADIENT = 2
|
||||
ACCENT_ENABLE_BLURBEHIND = 3 # Aero effect
|
||||
ACCENT_ENABLE_ACRYLICBLURBEHIND = 4 # Acrylic effect
|
||||
ACCENT_ENABLE_HOSTBACKDROP = 5 # Mica effect
|
||||
ACCENT_INVALID_STATE = 6
|
||||
|
||||
|
||||
class ACCENT_POLICY(Structure):
|
||||
""" Specific attributes of client area """
|
||||
|
||||
_fields_ = [
|
||||
("AccentState", DWORD),
|
||||
("AccentFlags", DWORD),
|
||||
("GradientColor", DWORD),
|
||||
("AnimationId", DWORD),
|
||||
]
|
||||
|
||||
|
||||
class WINDOWCOMPOSITIONATTRIBDATA(Structure):
|
||||
_fields_ = [
|
||||
("Attribute", DWORD),
|
||||
# Pointer() receives any ctypes type and returns a pointer type
|
||||
("Data", POINTER(ACCENT_POLICY)),
|
||||
("SizeOfData", ULONG),
|
||||
]
|
||||
|
||||
|
||||
class DWMNCRENDERINGPOLICY(Enum):
|
||||
DWMNCRP_USEWINDOWSTYLE = 0
|
||||
DWMNCRP_DISABLED = 1
|
||||
DWMNCRP_ENABLED = 2
|
||||
DWMNCRP_LAS = 3
|
||||
|
||||
|
||||
class DWMWINDOWATTRIBUTE(Enum):
|
||||
DWMWA_NCRENDERING_ENABLED = 1
|
||||
DWMWA_NCRENDERING_POLICY = 2
|
||||
DWMWA_TRANSITIONS_FORCEDISABLED = 3
|
||||
DWMWA_ALLOW_NCPAINT = 4
|
||||
DWMWA_CAPTION_BUTTON_BOUNDS = 5
|
||||
DWMWA_NONCLIENT_RTL_LAYOUT = 6
|
||||
DWMWA_FORCE_ICONIC_REPRESENTATION = 7
|
||||
DWMWA_FLIP3D_POLICY = 8
|
||||
DWMWA_EXTENDED_FRAME_BOUNDS = 9
|
||||
DWMWA_HAS_ICONIC_BITMAP = 10
|
||||
DWMWA_DISALLOW_PEEK = 11
|
||||
DWMWA_EXCLUDED_FROM_PEEK = 12
|
||||
DWMWA_CLOAK = 13
|
||||
DWMWA_CLOAKED = 14
|
||||
DWMWA_FREEZE_REPRESENTATION = 15
|
||||
DWMWA_PASSIVE_UPDATE_MODE = 16
|
||||
DWMWA_USE_HOSTBACKDROPBRUSH = 17
|
||||
DWMWA_USE_IMMERSIVE_DARK_MODE = 18
|
||||
DWMWA_WINDOW_CORNER_PREFERENCE = 19
|
||||
DWMWA_BORDER_COLOR = 20
|
||||
DWMWA_CAPTION_COLOR = 21
|
||||
DWMWA_TEXT_COLOR = 22
|
||||
DWMWA_VISIBLE_FRAME_BORDER_THICKNESS = 23
|
||||
DWMWA_LAST = 24
|
||||
|
||||
|
||||
class MARGINS(Structure):
|
||||
_fields_ = [
|
||||
("cxLeftWidth", c_int),
|
||||
("cxRightWidth", c_int),
|
||||
("cyTopHeight", c_int),
|
||||
("cyBottomHeight", c_int),
|
||||
]
|
||||
|
||||
|
||||
class MINMAXINFO(Structure):
|
||||
_fields_ = [
|
||||
("ptReserved", POINT),
|
||||
("ptMaxSize", POINT),
|
||||
("ptMaxPosition", POINT),
|
||||
("ptMinTrackSize", POINT),
|
||||
("ptMaxTrackSize", POINT),
|
||||
]
|
||||
|
||||
|
||||
class PWINDOWPOS(Structure):
|
||||
_fields_ = [
|
||||
('hWnd', HWND),
|
||||
('hwndInsertAfter', HWND),
|
||||
('x', c_int),
|
||||
('y', c_int),
|
||||
('cx', c_int),
|
||||
('cy', c_int),
|
||||
('flags', UINT)
|
||||
]
|
||||
|
||||
|
||||
class NCCALCSIZE_PARAMS(Structure):
|
||||
_fields_ = [
|
||||
('rgrc', RECT*3),
|
||||
('lppos', POINTER(PWINDOWPOS))
|
||||
]
|
@ -1,222 +0,0 @@
|
||||
# coding:utf-8
|
||||
import sys
|
||||
|
||||
from ctypes import POINTER, c_bool, c_int, pointer, sizeof, WinDLL, byref
|
||||
from ctypes.wintypes import DWORD, LONG, LPCVOID
|
||||
|
||||
from win32 import win32api, win32gui
|
||||
from win32.lib import win32con
|
||||
|
||||
from .c_structures import (
|
||||
ACCENT_POLICY,
|
||||
ACCENT_STATE,
|
||||
MARGINS,
|
||||
DWMNCRENDERINGPOLICY,
|
||||
DWMWINDOWATTRIBUTE,
|
||||
WINDOWCOMPOSITIONATTRIB,
|
||||
WINDOWCOMPOSITIONATTRIBDATA,
|
||||
)
|
||||
|
||||
|
||||
class WindowEffect:
|
||||
""" A class that calls Windows API to realize window effect """
|
||||
|
||||
def __init__(self):
|
||||
# Declare the function signature of the API
|
||||
self.user32 = WinDLL("user32")
|
||||
self.dwmapi = WinDLL("dwmapi")
|
||||
self.SetWindowCompositionAttribute = self.user32.SetWindowCompositionAttribute
|
||||
self.DwmExtendFrameIntoClientArea = self.dwmapi.DwmExtendFrameIntoClientArea
|
||||
self.DwmSetWindowAttribute = self.dwmapi.DwmSetWindowAttribute
|
||||
self.SetWindowCompositionAttribute.restype = c_bool
|
||||
self.DwmExtendFrameIntoClientArea.restype = LONG
|
||||
self.DwmSetWindowAttribute.restype = LONG
|
||||
self.SetWindowCompositionAttribute.argtypes = [
|
||||
c_int,
|
||||
POINTER(WINDOWCOMPOSITIONATTRIBDATA),
|
||||
]
|
||||
self.DwmSetWindowAttribute.argtypes = [c_int, DWORD, LPCVOID, DWORD]
|
||||
self.DwmExtendFrameIntoClientArea.argtypes = [c_int, POINTER(MARGINS)]
|
||||
|
||||
# Initialize structure
|
||||
self.accentPolicy = ACCENT_POLICY()
|
||||
self.winCompAttrData = WINDOWCOMPOSITIONATTRIBDATA()
|
||||
self.winCompAttrData.Attribute = WINDOWCOMPOSITIONATTRIB.WCA_ACCENT_POLICY.value
|
||||
self.winCompAttrData.SizeOfData = sizeof(self.accentPolicy)
|
||||
self.winCompAttrData.Data = pointer(self.accentPolicy)
|
||||
|
||||
def setAcrylicEffect(self, hWnd, gradientColor: str = "F2F2F299", isEnableShadow: bool = True, animationId: int = 0):
|
||||
""" Add the acrylic effect to the window
|
||||
|
||||
Parameters
|
||||
----------
|
||||
hWnd: int or `sip.voidptr`
|
||||
Window handle
|
||||
|
||||
gradientColor: str
|
||||
Hexadecimal acrylic mixed color, corresponding to four RGBA channels
|
||||
|
||||
isEnableShadow: bool
|
||||
Enable window shadows
|
||||
|
||||
animationId: int
|
||||
Turn on matte animation
|
||||
"""
|
||||
hWnd = int(hWnd)
|
||||
# Acrylic mixed color
|
||||
gradientColor = (
|
||||
gradientColor[6:]
|
||||
+ gradientColor[4:6]
|
||||
+ gradientColor[2:4]
|
||||
+ gradientColor[:2]
|
||||
)
|
||||
gradientColor = DWORD(int(gradientColor, base=16))
|
||||
# matte animation
|
||||
animationId = DWORD(animationId)
|
||||
# window shadow
|
||||
accentFlags = DWORD(0x20 | 0x40 | 0x80 |
|
||||
0x100) if isEnableShadow else DWORD(0)
|
||||
self.accentPolicy.AccentState = ACCENT_STATE.ACCENT_ENABLE_ACRYLICBLURBEHIND.value
|
||||
self.accentPolicy.GradientColor = gradientColor
|
||||
self.accentPolicy.AccentFlags = accentFlags
|
||||
self.accentPolicy.AnimationId = animationId
|
||||
# enable acrylic effect
|
||||
self.SetWindowCompositionAttribute(hWnd, pointer(self.winCompAttrData))
|
||||
|
||||
def setMicaEffect(self, hWnd):
|
||||
""" Add the mica effect to the window (Win11 only)
|
||||
|
||||
Parameters
|
||||
----------
|
||||
hWnd: int or `sip.voidptr`
|
||||
Window handle
|
||||
"""
|
||||
if sys.getwindowsversion().build < 22000:
|
||||
raise Exception("The mica effect is only available on Win11")
|
||||
|
||||
hWnd = int(hWnd)
|
||||
margins = MARGINS(-1, -1, -1, -1)
|
||||
self.DwmExtendFrameIntoClientArea(hWnd, byref(margins))
|
||||
self.DwmSetWindowAttribute(hWnd, 1029, byref(c_int(1)), 4)
|
||||
self.accentPolicy.AccentState = ACCENT_STATE.ACCENT_ENABLE_HOSTBACKDROP.value
|
||||
self.SetWindowCompositionAttribute(hWnd, pointer(self.winCompAttrData))
|
||||
|
||||
def setAeroEffect(self, hWnd):
|
||||
""" Add the aero effect to the window
|
||||
|
||||
Parameters
|
||||
----------
|
||||
hWnd: int or `sip.voidptr`
|
||||
Window handle
|
||||
"""
|
||||
hWnd = int(hWnd)
|
||||
self.accentPolicy.AccentState = ACCENT_STATE.ACCENT_ENABLE_BLURBEHIND.value
|
||||
self.SetWindowCompositionAttribute(hWnd, pointer(self.winCompAttrData))
|
||||
|
||||
def removeBackgroundEffect(self, hWnd):
|
||||
""" Remove background effect
|
||||
|
||||
Parameters
|
||||
----------
|
||||
hWnd: int or `sip.voidptr`
|
||||
Window handle
|
||||
"""
|
||||
hWnd = int(hWnd)
|
||||
self.accentPolicy.AccentState = ACCENT_STATE.ACCENT_DISABLED.value
|
||||
self.SetWindowCompositionAttribute(hWnd, pointer(self.winCompAttrData))
|
||||
|
||||
@staticmethod
|
||||
def moveWindow(hWnd):
|
||||
""" Move the window
|
||||
|
||||
Parameters
|
||||
----------
|
||||
hWnd: int or `sip.voidptr`
|
||||
Window handle
|
||||
"""
|
||||
hWnd = int(hWnd)
|
||||
win32gui.ReleaseCapture()
|
||||
win32api.SendMessage(
|
||||
hWnd, win32con.WM_SYSCOMMAND, win32con.SC_MOVE + win32con.HTCAPTION, 0
|
||||
)
|
||||
|
||||
def addShadowEffect(self, hWnd):
|
||||
""" Add DWM shadow to window
|
||||
|
||||
Parameters
|
||||
----------
|
||||
hWnd: int or `sip.voidptr`
|
||||
Window handle
|
||||
"""
|
||||
hWnd = int(hWnd)
|
||||
margins = MARGINS(-1, -1, -1, -1)
|
||||
self.DwmExtendFrameIntoClientArea(hWnd, byref(margins))
|
||||
|
||||
def addMenuShadowEffect(self, hWnd):
|
||||
""" Add DWM shadow to menu
|
||||
|
||||
Parameters
|
||||
----------
|
||||
hWnd: int or `sip.voidptr`
|
||||
Window handle
|
||||
"""
|
||||
hWnd = int(hWnd)
|
||||
self.DwmSetWindowAttribute(
|
||||
hWnd,
|
||||
DWMWINDOWATTRIBUTE.DWMWA_NCRENDERING_POLICY.value,
|
||||
byref(c_int(DWMNCRENDERINGPOLICY.DWMNCRP_ENABLED.value)),
|
||||
4,
|
||||
)
|
||||
margins = MARGINS(-1, -1, -1, -1)
|
||||
self.DwmExtendFrameIntoClientArea(hWnd, byref(margins))
|
||||
|
||||
def removeShadowEffect(self, hWnd):
|
||||
""" Remove DWM shadow from the window
|
||||
|
||||
Parameters
|
||||
----------
|
||||
hWnd: int or `sip.voidptr`
|
||||
Window handle
|
||||
"""
|
||||
hWnd = int(hWnd)
|
||||
self.DwmSetWindowAttribute(
|
||||
hWnd,
|
||||
DWMWINDOWATTRIBUTE.DWMWA_NCRENDERING_POLICY.value,
|
||||
byref(c_int(DWMNCRENDERINGPOLICY.DWMNCRP_DISABLED.value)),
|
||||
4,
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def removeMenuShadowEffect(hWnd):
|
||||
""" Remove shadow from pop-up menu
|
||||
|
||||
Parameters
|
||||
----------
|
||||
hWnd: int or `sip.voidptr`
|
||||
Window handle
|
||||
"""
|
||||
hWnd = int(hWnd)
|
||||
style = win32gui.GetClassLong(hWnd, win32con.GCL_STYLE)
|
||||
style &= ~0x00020000 # CS_DROPSHADOW
|
||||
win32api.SetClassLong(hWnd, win32con.GCL_STYLE, style)
|
||||
|
||||
@staticmethod
|
||||
def addWindowAnimation(hWnd):
|
||||
""" Enables the maximize and minimize animation of the window
|
||||
|
||||
Parameters
|
||||
----------
|
||||
hWnd : int or `sip.voidptr`
|
||||
Window handle
|
||||
"""
|
||||
hWnd = int(hWnd)
|
||||
style = win32gui.GetWindowLong(hWnd, win32con.GWL_STYLE)
|
||||
win32gui.SetWindowLong(
|
||||
hWnd,
|
||||
win32con.GWL_STYLE,
|
||||
style
|
||||
| win32con.WS_MAXIMIZEBOX
|
||||
| win32con.WS_CAPTION
|
||||
| win32con.CS_DBLCLKS
|
||||
| win32con.WS_THICKFRAME,
|
||||
)
|
Loading…
Reference in New Issue