From 6f2eb504ab64ce3831d52b780329614ee11d0bb4 Mon Sep 17 00:00:00 2001 From: ww-rm Date: Sun, 9 Nov 2025 12:29:41 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=B5=8C=E5=85=A5=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpineViewer/Views/MainWindow.xaml.cs | 18 +++++++++++++----- Win32Natives/User32.cs | 2 +- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/SpineViewer/Views/MainWindow.xaml.cs b/SpineViewer/Views/MainWindow.xaml.cs index aa60aff..6844fbc 100644 --- a/SpineViewer/Views/MainWindow.xaml.cs +++ b/SpineViewer/Views/MainWindow.xaml.cs @@ -449,17 +449,25 @@ public partial class MainWindow : Window _logger.Error("Failed to enable wallpaper view, WorkerW not found"); return; } - var handle = wnd.SystemHandle; User32.GetPrimaryScreenResolution(out var sw, out var sh); + _vm.SFMLRendererViewModel.SetResolution(sw, sh); - User32.SetParent(handle, workerw); + var handle = wnd.SystemHandle; + + // 每次都进行设置, 确保会成为顶层子窗口 + var lastParent = User32.SetParent(handle, workerw); + Debug.WriteLine($"0x{lastParent:x8} = SetParent(0x{handle:x8}, 0x{workerw:x8})"); User32.SetLayeredWindowAttributes(handle, 0, byte.MaxValue, User32.LWA_ALPHA); - _vm.SFMLRendererViewModel.SetResolution(sw, sh); + // XXX: 每次新设置成桌面子窗口之后, 要确保窗口 Size 发生一次变化来触发 SFML 内部的渲染视图更新 + var ssize = new SFML.System.Vector2u(sw, sh); + if (lastParent != workerw && ssize == wnd.Size) + { + wnd.Size = new(sw + 1, sh); + } wnd.Position = new(0, 0); - wnd.Size = new(sw + 1, sh); - wnd.Size = new(sw, sh); + wnd.Size = ssize; wnd.SetVisible(true); } else diff --git a/Win32Natives/User32.cs b/Win32Natives/User32.cs index 1dd4a09..0d25a62 100644 --- a/Win32Natives/User32.cs +++ b/Win32Natives/User32.cs @@ -316,7 +316,7 @@ namespace Win32Natives workerw = FindWindowEx(progman, IntPtr.Zero, "WorkerW", null); } - Debug.WriteLine($"HWND(WorkerW): {workerw:x8}"); + Debug.WriteLine($"HWND(WorkerW): 0x{workerw:x8}"); return workerw; }