From 00f57917662dc4e648a150726c8461db369e925f Mon Sep 17 00:00:00 2001 From: ww-rm Date: Fri, 28 Mar 2025 20:53:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=BC=E5=87=BA=E6=97=B6?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=A0=8F=E5=9B=BE=E6=A0=87=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpineViewer/MainForm.cs | 2 ++ SpineViewer/TaskbarManager.cs | 65 +++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 SpineViewer/TaskbarManager.cs diff --git a/SpineViewer/MainForm.cs b/SpineViewer/MainForm.cs index 99b0e56..fde3d90 100644 --- a/SpineViewer/MainForm.cs +++ b/SpineViewer/MainForm.cs @@ -146,10 +146,12 @@ namespace SpineViewer { var worker = (BackgroundWorker)sender; var exporter = (Exporter.Exporter)e.Argument; + Invoke(() => TaskbarManager.SetProgressState(Handle, TBPFLAG.TBPF_INDETERMINATE)); spinePreviewer.StopRender(); lock (spineListView.Spines) { exporter.Export(spineListView.Spines.Where(sp => !sp.IsHidden).ToArray(), (BackgroundWorker)sender); } e.Cancel = worker.CancellationPending; spinePreviewer.StartRender(); + Invoke(() => TaskbarManager.SetProgressState(Handle, TBPFLAG.TBPF_NOPROGRESS)); } private void ConvertFileFormat_Work(object? sender, DoWorkEventArgs e) diff --git a/SpineViewer/TaskbarManager.cs b/SpineViewer/TaskbarManager.cs new file mode 100644 index 0000000..f255cb5 --- /dev/null +++ b/SpineViewer/TaskbarManager.cs @@ -0,0 +1,65 @@ +using System; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace SpineViewer +{ + internal enum TBPFLAG + { + TBPF_NOPROGRESS = 0, + TBPF_INDETERMINATE = 0x1, + TBPF_NORMAL = 0x2, + TBPF_ERROR = 0x4, + TBPF_PAUSED = 0x8 + } + + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [ComImport, Guid("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf")] + internal interface ITaskbarList3 + { + // ITaskbarList + void HrInit(); + void AddTab(IntPtr hwnd); + void DeleteTab(IntPtr hwnd); + void ActivateTab(IntPtr hwnd); + void SetActiveAlt(IntPtr hwnd); + // ITaskbarList2 + void MarkFullscreenWindow(IntPtr hwnd, [MarshalAs(UnmanagedType.Bool)] bool fFullscreen); + // ITaskbarList3 + void SetProgressValue(IntPtr hwnd, ulong ullCompleted, ulong ullTotal); + void SetProgressState(IntPtr hwnd, TBPFLAG tbpFlags); + //void RegisterTab(IntPtr hwndTab, IntPtr hwndMDI); + //void UnregisterTab(IntPtr hwndTab); + //void SetTabOrder(IntPtr hwndTab, IntPtr hwndInsertBefore); + //void SetTabActive(IntPtr hwndTab, IntPtr hwndMDI, uint dwReserved); + //void ThumbBarAddButtons(IntPtr hwnd, uint cButtons, THUMBBUTTON[] pButton); + //void ThumbBarUpdateButtons(IntPtr hwnd, uint cButtons, THUMBBUTTON[] pButton); + //void ThumbBarSetImageList(IntPtr hwnd, IntPtr himl); + //void SetOverlayIcon(IntPtr hwnd, IntPtr hIcon, string pszDescription); + //void SetThumbnailTooltip(IntPtr hwnd, string pszTip); + //void SetThumbnailClip(IntPtr hwnd, ref RECT prcClip); + } + + [ComImport, Guid("56FDF344-FD6D-11d0-958A-006097C9A090")] + internal class TaskbarList { } + + internal static class TaskbarManager + { + private static readonly ITaskbarList3 taskbarList = (ITaskbarList3)new TaskbarList(); + + static TaskbarManager() + { + taskbarList.HrInit(); + } + + public static void SetProgressState(IntPtr windowHandle, TBPFLAG state) + { + taskbarList.SetProgressState(windowHandle, state); + } + + public static void SetProgressValue(IntPtr windowHandle, ulong completed, ulong total) + { + taskbarList.SetProgressValue(windowHandle, completed, total); + } + } +}