Skip to content

Commit

Permalink
main : added window transparency example for WIndows
Browse files Browse the repository at this point in the history
  • Loading branch information
my1e5 committed Mar 15, 2023
1 parent 7ed6d47 commit d97f6c2
Show file tree
Hide file tree
Showing 5 changed files with 487 additions and 0 deletions.
73 changes: 73 additions & 0 deletions window/transparency/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# Credit @Tensor - https://discord.com/channels/736279277242417272/1068600047090016397/1070025491895029760
# Tested on Windows 11
# Check that you have "Transparency effects" enabled in Windows Settings

import ctypes

import dearpygui.dearpygui as dpg

import tools
from windoweffect import window_effect

dpg.create_context()
dpg.create_viewport(decorated=True, resizable=True, clear_color=[0, 0, 0, 0])
dpg.setup_dearpygui()


class MARGINS(ctypes.Structure):
_fields_ = [
("cxLeftWidth", ctypes.c_int),
("cxRightWidth", ctypes.c_int),
("cyTopHeight", ctypes.c_int),
("cyBottomHeight", ctypes.c_int)
]


def removeBackground():
margins = MARGINS(-1, -1, -1, -1)
ctypes.windll.dwmapi.DwmExtendFrameIntoClientArea(tools.get_hwnd(), margins)


def restoreBackground():
margins = MARGINS(0, 0, 0, 0)
ctypes.windll.dwmapi.DwmExtendFrameIntoClientArea(tools.get_hwnd(), margins)


def removeBackgroundEffect():
window_effect.removeBackgroundEffect(tools.get_hwnd())


def setAeroEffect():
window_effect.setAeroEffect(tools.get_hwnd())


def setAcrylicEffect():
gradientColor = list(map(lambda item: int(item), dpg.get_value('color_picker')))
gradientColor = bytearray(gradientColor).hex().upper()
enableShadow = dpg.get_value('enable_shadow')
window_effect.setAcrylicEffect(tools.get_hwnd(), gradientColor=gradientColor, enableShadow=enableShadow)


def setMicaEffect():
isDarkMode = dpg.get_value('is_dark_mode')
window_effect.setMicaEffect(tools.get_hwnd(), isDarkMode=isDarkMode)


with dpg.window(label="Background Effect Test", height=500):
dpg.add_checkbox(label="decorated", default_value=True, callback=lambda _, flag: dpg.set_viewport_decorated(flag))
with dpg.group(horizontal=True):
dpg.add_button(label="removeBackground (Transparency)", callback=removeBackground)
dpg.add_button(label="Restore", callback=restoreBackground)
dpg.add_button(label="removeBackgroundEffect", callback=removeBackgroundEffect)
dpg.add_button(label="setAeroEffect", callback=setAeroEffect)
with dpg.group(horizontal=True):
dpg.add_button(label="setAcrylicEffect", callback=setAcrylicEffect)
dpg.add_checkbox(label="enableShadow", default_value=False, tag="enable_shadow")
with dpg.group(horizontal=True):
dpg.add_button(label="setMicaEffect", callback=setMicaEffect)
dpg.add_checkbox(label="isDarkMode", default_value=False, tag="is_dark_mode")
dpg.add_color_picker(display_type=dpg.mvColorEdit_uint8, picker_mode=dpg.mvColorPicker_bar, alpha_bar=True, tag='color_picker')

dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()
35 changes: 35 additions & 0 deletions window/transparency/tools.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from __future__ import annotations

import ctypes
import ctypes.wintypes
import os

user32 = ctypes.windll.user32
WNDENUMPROC = ctypes.WINFUNCTYPE(ctypes.wintypes.BOOL,
ctypes.wintypes.HWND,
ctypes.wintypes.LPARAM)
user32.EnumWindows.argtypes = [WNDENUMPROC,
ctypes.wintypes.LPARAM]


def get_hwnd_from_pid(pid: int) -> int | None:
result = None

def callback(hwnd, _):
nonlocal result
lpdw_PID = ctypes.c_ulong()
user32.GetWindowThreadProcessId(hwnd, ctypes.byref(lpdw_PID))
hwnd_PID = lpdw_PID.value

if hwnd_PID == pid:
result = hwnd
return False
return True

cb_worker = WNDENUMPROC(callback)
user32.EnumWindows(cb_worker, 0)
return result


def get_hwnd() -> int | None:
return get_hwnd_from_pid(os.getpid())
5 changes: 5 additions & 0 deletions window/transparency/windoweffect/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# https://github.com/zhiyiYo/PyQt-Frameless-Window/tree/master/qframelesswindow/windows

from .window_effect import WindowsWindowEffect

window_effect = WindowsWindowEffect()
144 changes: 144 additions & 0 deletions window/transparency/windoweffect/c_structures.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
# 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_HOLOGRAPHIC = 23
WCA_EXCLUDED_FROM_DDA = 24
WCA_PASSIVEUPDATEMODE = 25
WCA_USEDARKMODECOLORS = 26
WCA_CORNER_STYLE = 27
WCA_PART_COLOR = 28
WCA_DISABLE_MOVESIZE_FEEDBACK = 29
WCA_LAST = 30


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))
]


LPNCCALCSIZE_PARAMS = POINTER(NCCALCSIZE_PARAMS)
Loading

0 comments on commit d97f6c2

Please sign in to comment.