Beschreibung:
Ein nettes neues Feature in Windows 7 ist die Anzeige eines Fortschrittsbalkens in einem Taskbar button (siehe angehängtes Bild).
Dies kann wie folgt implementiert werden:
Nötige COM-Komponenten einbinden + interface, struct und enmus definieren:
using System;
using System.Runtime.InteropServices;
namespace MyApp
{
[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;
public int top;
public int right;
public int bottom;
public RECT(int left, int top, int right, int bottom)
{
this.left = left;
this.top = top;
this.right = right;
this.bottom = bottom;
}
}
}
Objekt von TaskbarList erstellen:
ITaskbarList3 tbl = (ITaskbarList3)new TaskbarList();
Progress ändern mittels:
tbl.SetProgressValue(this.Handle, 70 /*Angezeigter Wert*/, 100 /*Maximaler Wert*/);
Progressbar style deaktivieren mittels:
tbl.SetProgressState(this.Handle, TBPFLAG.TBPF_NOPROGRESS);
Weitere Informationen:
Viel Spaß damit,
moson
btw.: Im Interface sind noch einige andere Spielereien definiert, einfach mal rumspielen...
Schlagwörter: Windows 7, Taskbar, progressbar, progress, taskbarbutton, superbar
Wobei man die Lizenzbedingungen prüfen sollte und beachten sollte, dass das auf Framework 3.5 ausgelegt ist. Davon abgesehen, dass die für die meisten Sachen Overkill sein dürfte 😉 (aber das ist ja Auslegungssache).
Stimmt, in der Bibliothek sind aber so ziemlich alle neuen Windows 7 Funktionen enthalten. Also auch alles zu den Jumplists und IconOverlays, etc...
Fabi
Oder noch einfacher: Windows 7 Progress Bar. Wunderbar einfach in ein ProgressBar-Control gewrappt. 😃