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": [ + "*" + ] + } }