2009-08-18 13 views
62

Wenn Sie in der Windows 7-Betaversion festgestellt haben, dass beim Kopieren von Dateien oder anderen Systemaktionen das Windows Explorer-Symbol in der Taskleiste mit einem grünen Fortschrittsbalken angezeigt wird, der dem Fortschrittsbalken im Formular entspricht. Gibt es eine Möglichkeit, dass ich in meinen C# -Formularen den Taskbar-Fortschrittsbalken zwingen kann, den Fortschritt meiner Aufgaben zu vergleichen? Konvertieren, Übertragen, Erzeugen, es gibt so viele Verwendungsmöglichkeiten für diesen Fortschrittsbalken.Windows 7 Fortschrittsbalken in der Taskleiste in C#?

Antwort

44

Für Menschen, die in der Dokumentation überspringen wollen lesen und nur etwas, das funktioniert ...

  • Laden Sie die Windows API Code Pack for Microsoft .Net Framework herunter.
  • Führen Sie das Installationsprogramm, die eine Zip-Datei
  • Extrahieren Sie die folgenden DLLs aus dem Binär-Dateien-Ordner der ZIP-Datei erstellt:
    • Microsoft.WindowsAPICodePack.dll
    • Microsoft.WindowsAPICodePack.Shell.dll
  • Fügen Sie einen Verweis auf sie in Ihrem Projekt
  • Fügen Sie den folgenden Code in Ihre App ein und ändern Sie sie bei Bedarf:

-

int max = 100; 
    var prog = Microsoft.WindowsAPICodePack.Taskbar.TaskbarManager.Instance; 
    prog.SetProgressState(Microsoft.WindowsAPICodePack.Taskbar.TaskbarProgressBarState.Normal); 
    for(int i=0;i<max;i++) { 
    prog.SetProgressValue(i, max); 
    Thread.Sleep(100);  
    } 
    prog.SetProgressState(Microsoft.WindowsAPICodePack.Taskbar.TaskbarProgressBarState.NoProgress); 
+0

Der Nuget-Download ist ein bisschen nervig, aber ja, funktioniert super. Implementiert in meiner Fortschrittsbalken-Handler-Klasse :) – Nyerguds

0

fand ich einen schönen Artikel (Link), die eine einfache Lösung in der Taskleiste Statusleiste Problem bietet. Zusammenfassend weist es Ihnen die Windows-API-Pack from the MSDN website, das Hinzufügen eines Verweises auf die Microsoft.WindowsAPICodePack.Shell.dll herunterladen, die es enthält, und schließlich drei Zeilen Code in die Anwendung einzufügen:

Imports Microsoft.WindowsAPICodePack 
Imports Microsoft.WindowsAPICodePack.Taskbar 
// ... 
TaskbarManager.Instance.SetProgressValue(X, 100) 

wo X ist der Fortschritt, den Sie anzeigen möchten.

+2

Beachten Sie, dass [nur Link-Antworten entmutigt werden] (http://meta.stackoverflow.com/tags/link-only-answers/info), SO-Antworten sollten der Endpunkt sein einer Suche nach einer Lösung (im Gegensatz zu einem weiteren Zwischenstopp von Referenzen, die im Laufe der Zeit abgestanden werden). Bitte beachten Sie, dass Sie hier eine eigenständige Zusammenfassung hinzufügen und den Link als Referenz beibehalten. – kleopatra

58

Ich wollte nur eine Taskleiste Fortschrittsanimation zu meiner WinForms-Anwendung hinzufügen, , ohne Code Packs herunterladen oder wechseln zu WPF, um TaskbarItemInfo zu verwenden.

Die Lösung war eine Klasse, die die ITaskbarList3-Schnittstelle verwendet:

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); 
    } 
} 

Beispiel dafür, wie einfach es ist, zu verwenden:

TaskbarProgress.SetState(this.Handle, TaskbarProgress.TaskbarStates.Indeterminate); 

or 

TaskbarProgress.SetValue(this.Handle, 50, 100); 
TaskbarProgress.SetState(this.Handle, TaskbarProgress.TaskbarStates.Error); 
+3

Das ist eine unglaublich fantastische Antwort; keine externen Abhängigkeiten oder Downloads, und funktioniert einfach – Ben

+1

Wenn Sie SetOverlayIcon hinzufügen möchten, wie ich tat, achten Sie darauf, alle zusätzlichen Methoden * in der richtigen Reihenfolge * hinzuzufügen. Siehe die akzeptierte Antwort für http://stackoverflow.com/questions/1024786/windows-7-taskbar-setoverlayicon-from-wpf-app-doesnt-work –

+0

Leider bricht dies die Anwendung bei der Ausführung unter Windows XP! Irgendeine Lösungsmöglichkeit? –

Verwandte Themen