it-swarm.com.de

Windows 7-Fortschrittsleiste in der Taskleiste in C #?

Wenn Sie in der Windows 7-Betaversion bemerkt haben, wenn Sie Dateien oder andere Systemaktionen kopieren, füllt sich das Windows Explorer-Symbol in der Taskleiste mit einer grünen Fortschrittsleiste, die der Fortschrittsleiste im Formular entspricht. Gibt es eine Möglichkeit, dass ich in meinen C # -Formularen die Fortschrittsleiste in der Taskleiste so einstellen kann, dass sie mit dem Fortschritt der von mir ausgeführten Aufgabe übereinstimmt? Konvertieren, Übertragen, Generieren, es gibt viele Verwendungsmöglichkeiten für diese Fortschrittsanzeige.

67
CoreyOg

Ich wollte nur eine Taskbar-Fortschrittsanimation zu meiner WinForms-Anwendung hinzufügen, Ohne Code-Packs herunterladen oder zur Verwendung von TaskbarItemInfo zu WPF wechseln zu müssen.

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 für die einfache Verwendung:

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

or

TaskbarProgress.SetValue(this.Handle, 50, 100);
TaskbarProgress.SetState(this.Handle, TaskbarProgress.TaskbarStates.Error);
68
WhoIsRich

Für Leute, die die Dokumentation überspringen möchten und einfach etwas bekommen, was funktioniert ...

  • Laden Sie das Windows API Code Pack für Microsoft .Net Framework herunter.
  • Führen Sie das Installationsprogramm aus, das eine ZIP-Datei erstellt
  • Extrahieren Sie die folgenden DLLs aus dem Binärordner der ZIP-Datei:
    • Microsoft.WindowsAPICodePack.dll
    • Microsoft.WindowsAPICodePack.Shell.dll
  • Fügen Sie ihnen einen Verweis in Ihrem Projekt hinzu
  • 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);
46
Mark Lakata
39
Armbrat

Ja, Microsoft behandelte die neuen Taskleistenfunktionen im folgenden Dokument (einschließlich Quellen): Windows 7-Taskleiste: Developer Resources

5
arul

Ja, Sie müssen diese API verwenden.

http://code.msdn.Microsoft.com/WindowsAPICodePack

4
Alex

Ich habe einen schönen Artikel ( Link ) gefunden, der eine einfache Lösung für das Taskleistenproblem darstellt. Zusammenfassend werden Sie aufgefordert, das Windows-API-Paket von der MSDN-Website herunterzuladen, einen Verweis auf die darin enthaltene Microsoft.WindowsAPICodePack.Shell.dll hinzuzufügen und schließlich Ihrer Anwendung drei Codezeilen hinzuzufügen:

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

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

0
blondii