Skip to content

Commit 274bf0d

Browse files
authored
[Winforms] Title bar theme follows system theme changes (#1595)
1 parent 94757b9 commit 274bf0d

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

webview/platforms/winforms.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
from System.Drawing import Color, ColorTranslator, Icon, Point, Size, SizeF
3030
from System.Threading import ApartmentState, Thread, ThreadStart
3131
from System.Reflection import Assembly, BindingFlags
32+
from Microsoft.Win32 import SystemEvents
3233

3334
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
3435
logger = logging.getLogger('pywebview')
@@ -271,9 +272,41 @@ def __init__(self, window, cache_dir):
271272

272273
self.localization = window.localization
273274

275+
self.update_title_bar_theme()
276+
SystemEvents.UserPreferenceChanged += self.on_system_theme_changed
277+
274278
def __str__(self):
275279
return f'<System.Windows.Forms object with {self.Handle} handle>'
276280

281+
def on_system_theme_changed(self, sender, e):
282+
self.update_title_bar_theme()
283+
284+
def update_title_bar_theme(self):
285+
if self.is_dark_theme():
286+
DwmSetWindowAttribute(self.Handle.ToInt32(), 20, 1)
287+
DwmSetWindowAttribute(self.Handle.ToInt32(), 38, 2)
288+
else:
289+
DwmSetWindowAttribute(self.Handle.ToInt32(), 20, 0)
290+
DwmSetWindowAttribute(self.Handle.ToInt32(), 38, 1)
291+
292+
def is_dark_theme(self):
293+
try:
294+
personalize_key = winreg.OpenKey(
295+
winreg.HKEY_CURRENT_USER,
296+
r"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize",
297+
0,
298+
winreg.KEY_READ
299+
)
300+
system_theme, _ = winreg.QueryValueEx(personalize_key, "SystemUsesLightTheme")
301+
winreg.CloseKey(personalize_key)
302+
if system_theme == 0:
303+
return True
304+
else:
305+
return False
306+
except Exception as e:
307+
logger.error(f'Error while getting system theme: {e}')
308+
return None
309+
277310
def on_activated(self, *_):
278311
if not self.pywebview_window.focus:
279312
windll.user32.SetWindowLongW(self.Handle.ToInt32(), -20, windll.user32.GetWindowLongW(self.Handle.ToInt32(), -20) | 0x8000000)

0 commit comments

Comments
 (0)