Fortschrittsleiste in der Taskleiste (Windows 7)

Wer bereits das neue Betriebssystem Windows 7 sein Eigen nennen darf, hat sicherlich schon bemerkt, dass einige nette Grafikeffekte dazugekommen sind. Einer davon ist die neue Fortschrittsleiste in der Taskleiste. Lädt man beispielsweise mit dem Internet Explorer eine Datei herunter, wird der Fortschritt des Downloads zusätzlich in der Taskleiste angezeigt. Gerade wenn das Fenster minimiert ist, behält man dadurch den Überblick.

Win 7 Task bar

Damit Sie dieses Feature in Ihrer eigenen Applikation nutzen können, müssen Sie lediglich das COM-Interface ITaskbarList3 implementieren.


Erstellen Sie in Ihrem C# Projekt eine neue Klassen-Datei und fügen folgenden Code hinein:

   1:  using System;
   2:  using System.Runtime.InteropServices;
   3:   
   4:  namespace MB.UI.Tools
   5:  {
   6:      [ComImportAttribute()]
   7:      [GuidAttribute("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf")]
   8:      [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
   9:      interface ITaskbarList3
  10:      {
  11:          [PreserveSig]
  12:          void HrInit();
  13:          [PreserveSig]
  14:          void AddTab(IntPtr hwnd);
  15:          [PreserveSig]
  16:          void DeleteTab(IntPtr hwnd);
  17:          [PreserveSig]
  18:          void ActivateTab(IntPtr hwnd);
  19:          [PreserveSig]
  20:          void SetActiveAlt(IntPtr hwnd);
  21:   
  22:          [PreserveSig]
  23:          void MarkFullscreenWindow(IntPtr hwnd, [MarshalAs(UnmanagedType.Bool)] bool fFullscreen);
  24:   
  25:          void SetProgressValue(IntPtr hwnd, UInt64 ullCompleted, UInt64 ullTotal);
  26:          void SetProgressState(IntPtr hwnd, TBPFLAG tbpFlags);
  27:          void RegisterTab(IntPtr hwndTab, IntPtr hwndMDI);
  28:          void UnregisterTab(IntPtr hwndTab);
  29:          void SetTabOrder(IntPtr hwndTab, IntPtr hwndInsertBefore);
  30:          void SetTabActive(IntPtr hwndTab, IntPtr hwndMDI, TBATFLAG tbatFlags);
  31:          void ThumbBarAddButtons(IntPtr hwnd, uint cButtons, [MarshalAs(UnmanagedType.LPArray)] THUMBBUTTON[] pButtons);
  32:          void ThumbBarUpdateButtons(IntPtr hwnd, uint cButtons, [MarshalAs(UnmanagedType.LPArray)] THUMBBUTTON[] pButtons);
  33:          void ThumbBarSetImageList(IntPtr hwnd, IntPtr himl);
  34:          void SetOverlayIcon(IntPtr hwnd, IntPtr hIcon, [MarshalAs(UnmanagedType.LPWStr)] string pszDescription);
  35:          void SetThumbnailTooltip(IntPtr hwnd, [MarshalAs(UnmanagedType.LPWStr)] string pszTip);
  36:          void SetThumbnailClip(IntPtr hwnd, ref RECT prcClip);
  37:      }
  38:      [GuidAttribute("56FDF344-FD6D-11d0-958A-006097C9A090")]
  39:      [ClassInterfaceAttribute(ClassInterfaceType.None)]
  40:      [ComImportAttribute()]
  41:      class TaskbarList { }
  42:      [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
  43:      struct THUMBBUTTON
  44:      {
  45:          [MarshalAs(UnmanagedType.U4)]
  46:          public THBMASK dwMask;
  47:          public uint iId;
  48:          public uint iBitmap;
  49:          public IntPtr hIcon;
  50:          [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
  51:          public string szTip;
  52:          [MarshalAs(UnmanagedType.U4)]
  53:          public THBFLAGS dwFlags;
  54:      }
  55:      enum THBMASK
  56:      {
  57:          THB_BITMAP = 0x1,
  58:          THB_ICON = 0x2,
  59:          THB_TOOLTIP = 0x4,
  60:          THB_FLAGS = 0x8
  61:      }
  62:   
  63:      enum THBFLAGS
  64:      {
  65:          THBF_ENABLED = 0,
  66:          THBF_DISABLED = 0x1,
  67:          THBF_DISMISSONCLICK = 0x2,
  68:          THBF_NOBACKGROUND = 0x4,
  69:          THBF_HIDDEN = 0x8
  70:      }
  71:      enum TBPFLAG
  72:      {
  73:          TBPF_NOPROGRESS = 0,
  74:          TBPF_INDETERMINATE = 0x1,
  75:          TBPF_NORMAL = 0x2,
  76:          TBPF_ERROR = 0x4,
  77:          TBPF_PAUSED = 0x8
  78:      }
  79:      enum TBATFLAG
  80:      {
  81:          TBATF_USEMDITHUMBNAIL = 0x1,
  82:          TBATF_USEMDILIVEPREVIEW = 0x2
  83:      }
  84:      struct RECT
  85:      {
  86:          public int left;
  87:          public int top;
  88:          public int right;
  89:          public int bottom;
  90:   
  91:          public RECT(int left, int top, int right, int bottom)
  92:          {
  93:              this.left = left;
  94:              this.top = top;
  95:              this.right = right;
  96:              this.bottom = bottom;
  97:          }
  98:      }
  99:  }


Speichern Sie nun die Datei unter dem Namen „Win7Progress.cs“ ab. In Ihrer Benutzeroberfläche können Sie das eben erzeugte Interface ansprechen und den Fortschritt setzen. Die folgenden Zeilen, veranschaulichen die Anwendung:


   1:  ITaskbarList3 taskBar = null;
   2:  try
   3:  {
   4:      //Zugriff auf das Interface
   5:      taskBar = (ITaskbarList3)new TaskbarList();
   6:   
   7:      //Fortschritt setzen
   8:      taskBar.SetProgressValue(this.Handle, 45, 100);
   9:   
  10:      //Die Fortschrittsanzeige entfernen
  11:      taskBar.SetProgressState(this.Handle, TBPFLAG.TBPF_NOPROGRESS);
  12:  }
  13:  catch (Exception)
  14:  {
  15:      /*not supported. probably no Win7 OS*/
  16:  }
  17:  finally
  18:  {
  19:      if (taskBar!= null)
  20:  Marshal.FinalReleaseComObject(taskBar);
  21:  }


Da dieses Interface erst ab Windows 7 verfügbar ist, ist es sehr wichtig zu überprüfen, ob das Erstellen geklappt hat. Weitere Informationen finden Sie unter:

http://msdn.microsoft.com/en-us/library/dd391692%28VS.85%29.aspx