From 63ca5162102b371bc16fd6b9e5877134352fb58c Mon Sep 17 00:00:00 2001
From: DismissedLight <1686188646@qq.com>
Date: Mon, 30 Sep 2024 10:28:40 +0800
Subject: [PATCH 1/2] code style
---
.../src/CommunityToolkit.WinUI.Helpers.csproj | 3 +
components/Helpers/src/MultiTarget.props | 2 +-
components/Helpers/src/NativeMethods.json | 3 +
.../Helpers/src/ThemeListenerHelperWindow.cs | 101 ++++++++----------
4 files changed, 51 insertions(+), 58 deletions(-)
create mode 100644 components/Helpers/src/NativeMethods.json
diff --git a/components/Helpers/src/CommunityToolkit.WinUI.Helpers.csproj b/components/Helpers/src/CommunityToolkit.WinUI.Helpers.csproj
index 76f50f8f..8157235a 100644
--- a/components/Helpers/src/CommunityToolkit.WinUI.Helpers.csproj
+++ b/components/Helpers/src/CommunityToolkit.WinUI.Helpers.csproj
@@ -30,4 +30,7 @@
+
+
+
diff --git a/components/Helpers/src/MultiTarget.props b/components/Helpers/src/MultiTarget.props
index b11c1942..c780abff 100644
--- a/components/Helpers/src/MultiTarget.props
+++ b/components/Helpers/src/MultiTarget.props
@@ -6,4 +6,4 @@
-->
uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android;
-
\ No newline at end of file
+
diff --git a/components/Helpers/src/NativeMethods.json b/components/Helpers/src/NativeMethods.json
new file mode 100644
index 00000000..9725d209
--- /dev/null
+++ b/components/Helpers/src/NativeMethods.json
@@ -0,0 +1,3 @@
+{
+ "allowMarshaling": false
+}
diff --git a/components/Helpers/src/ThemeListenerHelperWindow.cs b/components/Helpers/src/ThemeListenerHelperWindow.cs
index 93a70cf0..e4a7944c 100644
--- a/components/Helpers/src/ThemeListenerHelperWindow.cs
+++ b/components/Helpers/src/ThemeListenerHelperWindow.cs
@@ -3,90 +3,77 @@
// See the LICENSE file in the project root for more information.
using Microsoft.Win32;
-using System;
-using System.Collections.Generic;
-using System.Linq;
+using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
-using System.Text;
-using System.Threading.Tasks;
using Windows.Win32;
+using Windows.Win32.Foundation;
+using Windows.Win32.UI.WindowsAndMessaging;
namespace CommunityToolkit.WinUI.HelpersRns;
#if WINAPPSDK
-
internal class ThemeListenerHelperWindow
{
public delegate void ThemeChangedHandler(ApplicationTheme theme);
public static ThemeListenerHelperWindow Instance = new();
- private static string s_className = "ThemeListenerHelperWindow";
- private IntPtr m_hwnd;
+
public event ThemeChangedHandler? ThemeChanged;
- delegate Windows.Win32.Foundation.LRESULT WndProc(Windows.Win32.Foundation.HWND hWnd, uint msg, Windows.Win32.Foundation.WPARAM wParam, Windows.Win32.Foundation.LPARAM lParam);
- private WndProc m_wnd_proc_delegate;
- private void registerClass()
+
+ private static string s_className = "ThemeListenerHelperWindow";
+
+ private HWND m_hwnd;
+
+ private ThemeListenerHelperWindow()
{
- unsafe
+ s_className = "ThemeListenerHelperWindow";
+ RegisterClass();
+ m_hwnd = CreateWindow();
+ }
+
+ private static unsafe void RegisterClass()
+ {
+ WNDCLASSEXW wcx = default;
+ wcx.cbSize = (uint)sizeof(WNDCLASSEXW);
+ fixed (char* pClassName = s_className)
{
- var wcx = new Windows.Win32.UI.WindowsAndMessaging.WNDCLASSEXW();
- wcx.cbSize = (uint)Marshal.SizeOf(wcx);
- fixed (char* pClassName = s_className)
- {
- wcx.lpszClassName = new Windows.Win32.Foundation.PCWSTR(pClassName);
- }
- wcx.lpfnWndProc = wndProc;
- if (PInvoke.RegisterClassEx(in wcx) == 0)
+ wcx.lpszClassName = pClassName;
+ wcx.lpfnWndProc = &WndProc;
+ if (PInvoke.RegisterClassEx(in wcx) is 0)
{
- Debug.WriteLine(new Win32Exception(Marshal.GetLastWin32Error()).Message);
+ Marshal.ThrowExceptionForHR(Marshal.GetLastPInvokeError());
}
}
-
}
- static Windows.Win32.Foundation.LRESULT wndProc(Windows.Win32.Foundation.HWND hWnd, uint msg, Windows.Win32.Foundation.WPARAM wParam, Windows.Win32.Foundation.LPARAM lParam)
+ private static unsafe HWND CreateWindow()
{
- switch (msg)
+ HWND hwnd = PInvoke.CreateWindowEx(0, s_className, string.Empty, 0, 0, 0, 0, 0, default, null, null, null);
+ if (hwnd == HWND.Null)
{
- case PInvoke.WM_SETTINGCHANGE:
- var value = Registry.GetValue(
- """HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize""",
- "AppsUseLightTheme",
- true
- );
- if (value != null)
- {
- Instance.ThemeChanged?.Invoke((int)value == 1 ? ApplicationTheme.Light : ApplicationTheme.Dark);
- }
- break;
+ Marshal.ThrowExceptionForHR(Marshal.GetLastPInvokeError());
}
- return PInvoke.DefWindowProc(hWnd, msg, wParam, lParam);
+ return hwnd;
}
- unsafe private static IntPtr createWindow()
+ [UnmanagedCallersOnly(CallConvs = [typeof(CallConvStdcall)])]
+ private static LRESULT WndProc(HWND hWnd, uint msg, WPARAM wParam, LPARAM lParam)
{
- var hwnd = PInvoke.CreateWindowEx(
- 0,
- s_className,
- "",
- 0,
- 0, 0, 0, 0,
- new Windows.Win32.Foundation.HWND(),
- null,
- null,
- null);
- if (hwnd == IntPtr.Zero)
+ if (msg is PInvoke.WM_SETTINGCHANGE)
{
- Debug.WriteLine(new Win32Exception(Marshal.GetLastWin32Error()).Message);
+ // REG_DWORD
+ object? value = Registry.GetValue(
+ @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize",
+ "AppsUseLightTheme",
+ true);
+
+ if (value is int dword)
+ {
+ Instance.ThemeChanged?.Invoke(dword is 1 ? ApplicationTheme.Light : ApplicationTheme.Dark);
+ }
}
- return hwnd;
- }
- private ThemeListenerHelperWindow()
- {
- m_wnd_proc_delegate = wndProc;
- s_className = "ThemeListenerHelperWindow";
- registerClass();
- m_hwnd = createWindow();
+
+ return PInvoke.DefWindowProc(hWnd, msg, wParam, lParam);
}
}
#endif
From 9ad6992d36a811cf534139f40d0ca79abb5fca5f Mon Sep 17 00:00:00 2001
From: DismissedLight <1686188646@qq.com>
Date: Mon, 30 Sep 2024 13:35:37 +0800
Subject: [PATCH 2/2] apply suggestion
---
.../Helpers/src/CommunityToolkit.WinUI.Helpers.csproj | 3 ---
components/Helpers/src/NativeMethods.json | 8 +++++++-
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/components/Helpers/src/CommunityToolkit.WinUI.Helpers.csproj b/components/Helpers/src/CommunityToolkit.WinUI.Helpers.csproj
index 8157235a..76f50f8f 100644
--- a/components/Helpers/src/CommunityToolkit.WinUI.Helpers.csproj
+++ b/components/Helpers/src/CommunityToolkit.WinUI.Helpers.csproj
@@ -30,7 +30,4 @@
-
-
-
diff --git a/components/Helpers/src/NativeMethods.json b/components/Helpers/src/NativeMethods.json
index 9725d209..be639985 100644
--- a/components/Helpers/src/NativeMethods.json
+++ b/components/Helpers/src/NativeMethods.json
@@ -1,3 +1,9 @@
{
- "allowMarshaling": false
+ "$schema": "https://aka.ms/CsWin32.schema.json",
+ "allowMarshaling": false,
+ "comInterop": {
+ "preserveSigMethods": [
+ "*"
+ ]
+ }
}