【问题标题】:Winforms - C# Taskbar Progress Indicator (Windows 10)Winforms - C# 任务栏进度指示器 (Windows 10)
【发布时间】:2020-12-02 14:07:30
【问题描述】:

Windows 10 上使用 C#* Windows 窗体,有没有办法在 任务栏上设置 进度指示器 /strong> 图标?在搜索时,几乎所有结果都指向了 Windows 7。我尝试使用 WindowsAPICodePackTaskbarItemInfoTaskbarManager 等。没有工作。下面是一些sn-ps的代码:

taskBarItemInfo.ProgressState = TaskbarItemProgressState.Normal;

for (int i = 0; i < 100; i++)
{
    taskBarItemInfo.ProgressValue = i / 100.0;
    Thread.Sleep(50); // whatever the 'work' really is
}

taskBarItemInfo.ProgressState = TaskbarItemProgressState.None;
using System;
using System.Runtime.InteropServices;

public static class TaskbarProgress
{
    public enum TaskbarStates
    {
        NoProgress    = 0,
        Indeterminate = 0x1,
        Normal        = 0x2,
        Error         = 0x4,
        Paused        = 0x8
    }

    [ComImport()]
    [Guid("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    private interface ITaskbarList3
    {
        // ITaskbarList
        [PreserveSig]
        void HrInit();
        [PreserveSig]
        void AddTab(IntPtr hwnd);
        [PreserveSig]
        void DeleteTab(IntPtr hwnd);
        [PreserveSig]
        void ActivateTab(IntPtr hwnd);
        [PreserveSig]
        void SetActiveAlt(IntPtr hwnd);

        // ITaskbarList2
        [PreserveSig]
        void MarkFullscreenWindow(IntPtr hwnd, [MarshalAs(UnmanagedType.Bool)] bool fFullscreen);

        // ITaskbarList3
        [PreserveSig]
        void SetProgressValue(IntPtr hwnd, UInt64 ullCompleted, UInt64 ullTotal);
        [PreserveSig]
        void SetProgressState(IntPtr hwnd, TaskbarStates state);
    }

    [ComImport()]    
    [Guid("56fdf344-fd6d-11d0-958a-006097c9a090")]
    [ClassInterface(ClassInterfaceType.None)]
    private class TaskbarInstance
    {
    }

    private static ITaskbarList3 taskbarInstance = (ITaskbarList3)new TaskbarInstance();
    private static bool taskbarSupported = Environment.OSVersion.Version >= new Version(6, 1);

    public static void SetState(IntPtr windowHandle, TaskbarStates taskbarState)
    {
        if (taskbarSupported) taskbarInstance.SetProgressState(windowHandle, taskbarState);
    }

    public static void SetValue(IntPtr windowHandle, double progressValue, double progressMax)
    {
        if (taskbarSupported) taskbarInstance.SetProgressValue(windowHandle, (ulong)progressValue, (ulong)progressMax);
    }
}
TaskbarProgress.SetValue(this.Handle, 50, 100);
TaskbarProgress.SetState(this.Handle, TaskbarProgress.TaskbarStates.Indeterminate);

* 我的项目目前使用 .NET Framework 4.7.2

提前致谢

【问题讨论】:

  • Windows API CodePack 应该可以工作,假设您可以找到要使用的库。你实际上尝试了什么?你的问题很模糊。
  • @PeterDuniho 正如我的问题中所写,我尝试了上述 3 个代码。如果您有解决方案,请告诉我!谢谢

标签: c# winforms windows-10 taskbar windows-10-desktop


【解决方案1】:

旧答案:

在您的计算机中找到“presentationframework.dll”,就像“C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF”一样

然后,将其添加到您的项目中的引用,并在您的代码中添加“使用 System.Windows.Shell”。

再次尝试上面的代码。

——————————————

我必须进一步解释 以上库和类都应用于WPF程序

对于C# WinForm,您必须下载Microsoft.WindowsAPICodePack.dll和Microsoft.WindowsAPICodePack.Shell.dll,将它们导入到项目中,然后使用以下代码:

使用 Microsoft.WindowsAPICodePack.Taskbar;

在表单类中: private TaskbarManager TaskbarProcess = TaskbarManager.Instance;

在表单事件中: TaskbarProcess.SetProgressState(TaskbarProgressBarState.Normal); TaskbarProcess.SetProgressValue(current, total);

我在Win10 64bit和VS2017 .net4.5下测试过,上面的方法是可以的。

【讨论】:

  • 感谢您的回答!在接下来的几天里,我肯定会进行一些测试。
  • @Brhaka 我必须进一步解释,以上库和类适用于 WPF 程序对于 C# WinForm,请再次查看上述答案。
  • 感谢您的解释。非常感谢
  • 过几天我就能测试这些库了。当我这样做时,如果他们是正确的(我相信他们是正确的),我会接受你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 1970-01-01
  • 2010-12-18
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
相关资源
最近更新 更多