Fortschrittsleiste in der Taskleiste (Windows 7)
Seit Windows 7 gibt es einige neue Grafikeffekte – einer davon ist die Fortschrittsleiste direkt in der Taskleiste. Lädt man z. B. im Internet Explorer eine Datei herunter, wird der Fortschritt zusätzlich in der Taskleiste angezeigt. Gerade bei minimiertem Fenster behält man so den Überblick.
Um dieses Feature in einer eigenen Anwendung zu nutzen, muss lediglich das COM-Interface
ITaskbarList3 implementiert werden. Dazu wird in einem C#-Projekt eine neue
Klassen-Datei „Win7Progress.cs“ mit folgendem Inhalt angelegt:
using System;
using System.Runtime.InteropServices;
namespace MB.UI.Tools
{
[ComImportAttribute()]
[GuidAttribute("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf")]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
interface ITaskbarList3
{
[PreserveSig] void HrInit();
[PreserveSig] void AddTab(IntPtr hwnd);
[PreserveSig] void DeleteTab(IntPtr hwnd);
[PreserveSig] void ActivateTab(IntPtr hwnd);
[PreserveSig] void SetActiveAlt(IntPtr hwnd);
[PreserveSig]
void MarkFullscreenWindow(IntPtr hwnd, [MarshalAs(UnmanagedType.Bool)] bool fFullscreen);
void SetProgressValue(IntPtr hwnd, UInt64 ullCompleted, UInt64 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, TBATFLAG tbatFlags);
void ThumbBarAddButtons(IntPtr hwnd, uint cButtons, [MarshalAs(UnmanagedType.LPArray)] THUMBBUTTON[] pButtons);
void ThumbBarUpdateButtons(IntPtr hwnd, uint cButtons, [MarshalAs(UnmanagedType.LPArray)] THUMBBUTTON[] pButtons);
void ThumbBarSetImageList(IntPtr hwnd, IntPtr himl);
void SetOverlayIcon(IntPtr hwnd, IntPtr hIcon, [MarshalAs(UnmanagedType.LPWStr)] string pszDescription);
void SetThumbnailTooltip(IntPtr hwnd, [MarshalAs(UnmanagedType.LPWStr)] string pszTip);
void SetThumbnailClip(IntPtr hwnd, ref RECT prcClip);
}
[GuidAttribute("56FDF344-FD6D-11d0-958A-006097C9A090")]
[ClassInterfaceAttribute(ClassInterfaceType.None)]
[ComImportAttribute()]
class TaskbarList { }
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
struct THUMBBUTTON
{
[MarshalAs(UnmanagedType.U4)] public THBMASK dwMask;
public uint iId;
public uint iBitmap;
public IntPtr hIcon;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string szTip;
[MarshalAs(UnmanagedType.U4)] public THBFLAGS dwFlags;
}
enum THBMASK { THB_BITMAP = 0x1, THB_ICON = 0x2, THB_TOOLTIP = 0x4, THB_FLAGS = 0x8 }
enum THBFLAGS
{
THBF_ENABLED = 0,
THBF_DISABLED = 0x1,
THBF_DISMISSONCLICK = 0x2,
THBF_NOBACKGROUND = 0x4,
THBF_HIDDEN = 0x8
}
enum TBPFLAG
{
TBPF_NOPROGRESS = 0,
TBPF_INDETERMINATE = 0x1,
TBPF_NORMAL = 0x2,
TBPF_ERROR = 0x4,
TBPF_PAUSED = 0x8
}
enum TBATFLAG { TBATF_USEMDITHUMBNAIL = 0x1, TBATF_USEMDILIVEPREVIEW = 0x2 }
struct RECT
{
public int left, top, right, bottom;
public RECT(int left, int top, int right, int bottom)
{
this.left = left; this.top = top; this.right = right; this.bottom = bottom;
}
}
}
In der Benutzeroberfläche lässt sich das Interface anschließend ansprechen und der Fortschritt setzen:
ITaskbarList3 taskBar = null;
try
{
// Zugriff auf das Interface
taskBar = (ITaskbarList3)new TaskbarList();
// Fortschritt setzen
taskBar.SetProgressValue(this.Handle, 45, 100);
// Die Fortschrittsanzeige entfernen
taskBar.SetProgressState(this.Handle, TBPFLAG.TBPF_NOPROGRESS);
}
catch (Exception)
{
// nicht unterstützt, vermutlich kein Windows 7
}
finally
{
if (taskBar != null)
Marshal.FinalReleaseComObject(taskBar);
}
Da dieses Interface erst ab Windows 7 verfügbar ist, sollte das Erstellen des COM-Objekts immer in
einem try/catch-Block erfolgen. Weitere Informationen finden sich in der
Windows-Dokumentation zu ITaskbarList3.