Winforms - C# 任务栏进度指示器 (Windows 10)
Winforms - C# Taskbar Progress Indicator (Windows 10)
在 Windows 10 上使用 C#* Windows Forms,有没有办法设置一个进度指示器 在任务栏 图标上?在搜索它时,几乎所有结果都指向 Windows 7。我尝试使用 WindowsAPICodePack、TaskbarItemInfo、 TaskbarManager 等。 None 成功了。以下是一些代码片段:
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
提前致谢
旧答案:
在你的电脑中找到“presentationframework.dll”,就像“C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF”
然后,将其添加到项目中的引用,并在代码中添加“using System.Windows.Shell”。
再次尝试上面的代码。
————————————————
我必须进一步解释
以上库和classes应用于WPF程序
对于C# WinForm,您必须下载Microsoft.WindowsAPICodePack.dll和Microsoft.WindowsAPICodePack.Shell.dll,将它们导入到项目中,然后使用以下代码:
使用 Microsoft.WindowsAPICodePack.Taskbar;
在表格 class 中:
private TaskbarManager TaskbarProcess = TaskbarManager.Instance;
在表单事件中:
TaskbarProcess.SetProgressState(TaskbarProgressBarState.Normal);
TaskbarProcess.SetProgressValue(当前,总计);
我在Win10 64bit和VS2017 .net4.5测试过,上面的方法是可以的
在 Windows 10 上使用 C#* Windows Forms,有没有办法设置一个进度指示器 在任务栏 图标上?在搜索它时,几乎所有结果都指向 Windows 7。我尝试使用 WindowsAPICodePack、TaskbarItemInfo、 TaskbarManager 等。 None 成功了。以下是一些代码片段:
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
提前致谢
旧答案:
在你的电脑中找到“presentationframework.dll”,就像“C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF”
然后,将其添加到项目中的引用,并在代码中添加“using System.Windows.Shell”。
再次尝试上面的代码。
————————————————
我必须进一步解释 以上库和classes应用于WPF程序
对于C# WinForm,您必须下载Microsoft.WindowsAPICodePack.dll和Microsoft.WindowsAPICodePack.Shell.dll,将它们导入到项目中,然后使用以下代码:
使用 Microsoft.WindowsAPICodePack.Taskbar;
在表格 class 中: private TaskbarManager TaskbarProcess = TaskbarManager.Instance;
在表单事件中: TaskbarProcess.SetProgressState(TaskbarProgressBarState.Normal); TaskbarProcess.SetProgressValue(当前,总计);
我在Win10 64bit和VS2017 .net4.5测试过,上面的方法是可以的