Winforms - индикатор выполнения панели задач C # (Windows 10)

Используя C # * Windows Forms в Windows 10, можно ли настроить индикатор выполнения на панели задач значок? При поиске почти все результаты были направлены в Windows 7. Я пробовал использовать WindowsAPICodePack, TaskbarItemInfo, TaskbarManager и другие. Ни один не работал. Вот несколько фрагментов кода:

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.

заранее спасибо


person Brhaka    schedule 12.08.2020    source источник
comment
Windows API CodePack должен работать, если вы можете найти библиотеку для использования. Что ты на самом деле пробовал? Ваш вопрос довольно расплывчатый.   -  person Peter Duniho    schedule 06.11.2020
comment
@PeterDuniho Как написано в моем вопросе, я пробовал указанные выше 3 кода. Если у вас есть решение, дайте мне знать! Спасибо   -  person Brhaka    schedule 10.11.2020


Ответы (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;

В классе Form: private TaskbarManager TaskbarProcess = TaskbarManager.Instance;

В случае формы: TaskbarProcess.SetProgressState (TaskbarProgressBarState.Normal); TaskbarProcess.SetProgressValue (текущее, общее);

Я тестировал Win10 64bit и VS2017 .net4.5, описанный выше метод подходит.

person James    schedule 07.01.2021
comment
Спасибо за ваш ответ! Я обязательно проведу несколько тестов в следующие несколько дней. - person Brhaka; 07.01.2021
comment
@Brhaka Я должен объяснить дальше. Вышеупомянутые библиотеки и классы применяются к программам WPF. Для C # WinForm, пожалуйста, посмотрите ответ выше еще раз. - person James; 09.01.2021
comment
Спасибо за ваше объяснение. Очень признателен - person Brhaka; 09.01.2021
comment
Через несколько дней я смогу протестировать библиотеки. Когда я это сделаю, если они правы (а я верю, что это так), я приму ваш ответ. - person Brhaka; 09.01.2021
comment
Работает отлично! Спасибо @James - person Brhaka; 28.01.2021