2009-08-18 11 views
62

Jeśli zauważyłeś w wersji beta Windows 7, jeśli skopiujesz pliki lub inne działania systemowe, ikona Eksploratora Windows na pasku zadań wypełni się zielonym paskiem postępu odpowiadającym paskowi postępu w formularzu. Czy istnieje sposób, że w moich formularzach C# mogę wymusić pasek postępu paska zadań, aby dopasować postęp każdego zadania, które robię? Konwersja, przenoszenie, generowanie jest tak wiele zastosowań dla tego paska postępu.Pasek postępu Windows 7 na pasku zadań w C#?

Odpowiedz

44

Dla ludzi, którzy chcą pominąć czytanie dokumentacji i po prostu coś, co działa ...

  • Pobierz Windows API Code Pack for Microsoft .Net Framework.
  • Uruchom instalator, który tworzy plik zip
  • wyodrębnić następujące bibliotek DLL z folderu plików binarnych w pliku zip:
    • Microsoft.WindowsAPICodePack.dll
    • Microsoft.WindowsAPICodePack.Shell.dll
  • dodać odwołanie do nich w projekt
  • Umieść poniższy kod w swojej aplikacji i zmodyfikuj go w razie potrzeby:

-

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

Pobieranie nugetu jest trochę denerwujące, ale tak, działa świetnie. Wdrożone w mojej klasie obsługi paska postępu :) – Nyerguds

0

znalazłem piękny artykuł (Link), która zapewnia proste rozwiązanie do paska zadań problemu pasku postępu. Podsumowując, zaleci, aby pobrać pakiet API systemu Windows from the MSDN website, dodając odniesienie do Microsoft.WindowsAPICodePack.Shell.dll że zawiera ona, a na końcu dodać trzy linie kodu do aplikacji:

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

gdzie X to postęp, który chcesz wyświetlić.

+2

Należy pamiętać, że [odradza się tylko odpowiedzi z linkami] (http://meta.stackoverflow.com/tags/link-only-answers/info), odpowiedzi w formacie SO powinny być punktem końcowym poszukiwania rozwiązania (w przeciwieństwie do kolejnego zatrzymania referencji, które z czasem stają się nieaktualne). Proszę rozważyć dodanie samodzielnego streszczenia tutaj, zachowując odnośnik jako odniesienie. – kleopatra

58

Po prostu chciałem dodać animację postępu paska zadań do mojej aplikacji WinForm, , bez konieczności pobierania pakietów kodu lub przełączania się do WPF w celu użycia TaskbarItemInfo.

Rozwiązaniem była klasa, która korzysta z interfejsu ITaskbarList3:

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

Przykład, jak łatwo jest używać:

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

or 

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

To jest niesamowicie fantastyczna odpowiedź; brak zewnętrznych zależności lub plików do pobrania, i po prostu działa – Ben

+1

Jeśli chcesz dodać SetOverlayIcon, tak jak ja, pamiętaj, aby dodać wszystkie dodatkowe metody * w poprawnej kolejności *. Zobacz akceptowaną odpowiedź na http://stackoverflow.com/questions/1024786/windows-7-taskbar-setoverlaylay-mod-wpf-app-doesnt-work –

+0

Niestety, powoduje to uszkodzenie aplikacji podczas pracy w systemie Windows XP! Jakieś rozwiązanie? –

Powiązane problemy