it-swarm-eu.dev

Barra di avanzamento di Windows 7 nella barra delle applicazioni in C #?

Se hai notato nella beta di Windows 7, se copi file o altre azioni di sistema, l'icona di Windows Explorer nella barra delle applicazioni si riempirà di una barra di avanzamento verde equivalente alla barra di avanzamento del modulo. C'è un modo in cui, nelle mie forme C #, posso forzare la barra di avanzamento della mia barra delle applicazioni in modo che corrisponda all'avanzamento di qualsiasi attività che sto svolgendo? Conversione, trasferimento, generazione, ci sono così tanti usi per quella barra di avanzamento.

67
CoreyOg

Volevo solo aggiungere alcune animazioni di avanzamento della barra delle applicazioni alla mia applicazione WinForms, Senza dover scaricare pacchetti di codice o passare a WPF per usare TaskbarItemInfo.

La soluzione era una classe che utilizza l'interfaccia 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);
    }
}

Esempio di quanto sia facile da usare:

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

or

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

Per le persone che vogliono saltare la lettura della documentazione e ottenere qualcosa che funzioni ...

  • Scarica il Windows Code Pack API per Microsoft .Net Framework .
  • Esegui il programma di installazione che crea un file Zip
  • Estrarre le seguenti DLL dalla cartella dei file binari del file zip:
    • Microsoft.WindowsAPICodePack.dll
    • Microsoft.WindowsAPICodePack.Shell.dll
  • Aggiungi un riferimento a loro nel tuo progetto
  • Inserisci il codice seguente nella tua app e modifica se necessario:

-

  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

Sì, Microsoft ha coperto le nuove funzioni della barra delle applicazioni nel seguente documento (fonti incluse): Barra delle applicazioni di Windows 7: Risorse per gli sviluppatori

5
arul

Sì, è necessario utilizzare questa API.

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

4
Alex

Ho trovato un bellissimo articolo ( Link ) che fornisce una soluzione semplice al problema della barra di avanzamento della barra delle applicazioni. In breve, ti chiede di scaricare il pacchetto API di Windows dal sito Web MSDN , aggiungendo un riferimento a Microsoft.WindowsAPICodePack.Shell.dll che contiene e infine aggiungi tre linee di codice alla tua applicazione:

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

dove X è il progresso che vuoi mostrare.

0
blondii