|
29 | 29 | from System.Drawing import Color, ColorTranslator, Icon, Point, Size, SizeF |
30 | 30 | from System.Threading import ApartmentState, Thread, ThreadStart |
31 | 31 | from System.Reflection import Assembly, BindingFlags |
| 32 | +from Microsoft.Win32 import SystemEvents |
32 | 33 |
|
33 | 34 | kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) |
34 | 35 | logger = logging.getLogger('pywebview') |
@@ -271,9 +272,41 @@ def __init__(self, window, cache_dir): |
271 | 272 |
|
272 | 273 | self.localization = window.localization |
273 | 274 |
|
| 275 | + self.update_title_bar_theme() |
| 276 | + SystemEvents.UserPreferenceChanged += self.on_system_theme_changed |
| 277 | + |
274 | 278 | def __str__(self): |
275 | 279 | return f'<System.Windows.Forms object with {self.Handle} handle>' |
276 | 280 |
|
| 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 | + |
277 | 310 | def on_activated(self, *_): |
278 | 311 | if not self.pywebview_window.focus: |
279 | 312 | windll.user32.SetWindowLongW(self.Handle.ToInt32(), -20, windll.user32.GetWindowLongW(self.Handle.ToInt32(), -20) | 0x8000000) |
|
0 commit comments