C# 任务栏中的 Windows 7 进度条

c++

1个回答

写回答

F_FNTS

2025-07-02 23:25

+ 关注

Total
Total

使用C#来创建任务栏中的Windows 7进度条是一种非常常见的需求。在许多应用程序中,我们需要展示一个进度条来指示某个操作的完成情况,以便给用户一个直观的反馈。在Windows 7中,任务栏中的进度条提供了一种非常好的方式来展示进度。

如何实现任务栏中的Windows 7进度条

要在C#中实现任务栏中的Windows 7进度条,我们需要使用Windows API来完成这个任务。具体来说,我们需要使用Windows API中的Shell_NotifyIcon函数来设置任务栏中的进度条。

下面是一个示例代码,展示了如何在C#中实现任务栏中的Windows 7进度条:

csharp

using System;

using System.Runtime.InteropServices;

public class TaskbarProgress

{

[DllImport("shell32.dll", CharSet = CharSet.Auto)]

private static extern int Shell_NotifyIcon(int message, NOTIFYICONDATA pnid);

private const int NIM_MODIFY = 0x00000001;

private const int NIF_MESSAGE = 0x00000001;

private const int WM_USER = 0x0400;

private const int WM_TASKBARBUTTONCREATED = WM_USER + 5;

private const int TBPF_NOPROGRESS = 0;

private const int TBPF_INDETERMINATE = 0x1;

private const int TBPF_NORMAL = 0x2;

private const int TBPF_ERROR = 0x4;

private const int TBPF_PAUSED = 0x8;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]

private struct NOTIFYICONDATA

{

public int cbSize;

public IntPtr hWnd;

public int uID;

public int uFlags;

public int uCallbackMessage;

public IntPtr hIcon;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]

public string szTip;

public int dwState;

public int dwStateMask;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]

public string szInfo;

public int uTimeoutOrVersion;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]

public string szInfoTitle;

public int dwInfoFlags;

}

public static void SetProgressState(IntPtr windowHandle, int state)

{

NOTIFYICONDATA pnid = new NOTIFYICONDATA();

pnid.cbSize = Marshal.SizeOf(pnid);

pnid.hWnd = windowHandle;

pnid.uID = 0;

pnid.uFlags = NIF_MESSAGE;

pnid.uCallbackMessage = WM_TASKBARBUTTONCREATED;

pnid.dwState = state;

pnid.dwStateMask = state;

Shell_NotifyIcon(NIM_MODIFY, pnid);

}

public static void SetProgressValue(IntPtr windowHandle, int completed, int Total)

{

NOTIFYICONDATA pnid = new NOTIFYICONDATA();

pnid.cbSize = Marshal.SizeOf(pnid);

pnid.hWnd = windowHandle;

pnid.uID = 0;

pnid.uFlags = NIF_MESSAGE;

pnid.uCallbackMessage = WM_TASKBARBUTTONCREATED;

pnid.dwState = TBPF_NORMAL;

pnid.dwStateMask = TBPF_NORMAL;

pnid.szInfo = $"{completed} of {Total} completed";

pnid.szInfoTitle = "Progress";

Shell_NotifyIcon(NIM_MODIFY, pnid);

}

}

使用自定义进度条更新任务栏中的进度

在上面的示例代码中,我们定义了一个TaskbarProgress类,其中包含了两个静态方法:SetProgressState和SetProgressValue。SetProgressState方法用于设置任务栏中的进度条的状态,而SetProgressValue方法用于设置进度条的当前进度。

为了使用这些方法,我们需要传入窗口的句柄(windowHandle),以及进度条的状态和当前进度。通过调用Shell_NotifyIcon函数,我们可以将这些信息传递给任务栏,从而更新进度条的显示。

下面是一个简单的示例,展示了如何使用TaskbarProgress类来更新任务栏中的进度条:

csharp

using System;

using System.Windows.Forms;

public class MAInForm : Form

{

private IntPtr _windowHandle;

public MAInForm()

{

_windowHandle = Handle;

}

private void UpdateProgress()

{

// 模拟进度更新

for (int i = 1; i <= 100; i++)</p> {

TaskbarProgress.SetProgressValue(_windowHandle, i, 100);

System.Threading.Thread.Sleep(100); // 休眠100毫秒,模拟耗时操作

}

TaskbarProgress.SetProgressState(_windowHandle, TaskbarProgress.TBPF_NOPROGRESS);

}

protected override void OnLoad(EventArgs e)

{

base.OnLoad(e);

UpdateProgress();

}

}

public static class Program

{

[STAThread]

public static void MAIn()

{

Application.Run(new MAInForm());

}

}

在上面的示例中,我们创建了一个MAInForm类,其中包含了一个UpdateProgress方法,用于模拟进度的更新。在OnLoad事件中,我们调用了UpdateProgress方法来更新任务栏中的进度条。在每次更新进度之后,我们使用TaskbarProgress.TBPF_NOPROGRESS来将进度条状态设置为无进度。

这样,当我们运行这个示例程序时,就会在任务栏中看到一个进度条,它会随着模拟的进度更新而变化。

通过使用C#中的Windows API,我们可以很容易地实现任务栏中的Windows 7进度条。这个功能可以为用户提供直观的反馈,使他们可以清楚地了解某个操作的完成情况。通过使用TaskbarProgress类,我们可以轻松地更新任务栏中的进度条的状态和进度。这在许多应用程序中都是非常有用的功能。

希望这篇文章对你有帮助!

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号