75

Windows 7 ベータ版で気付いた場合は、ファイルまたはその他のシステム アクションをコピーすると、タスク バーの Windows エクスプローラー アイコンが、フォームの進行状況バーと同等の緑色の進行状況バーでいっぱいになります。私の C# フォームで、タスクバーの進行状況バーを実行中のタスクの進行状況と一致させる方法はありますか? 変換、転送、生成、そのプログレス バーには非常に多くの用途があります。

4

6 に答える 6

86

コード パックをダウンロードしたり、WPF に切り替えて TaskbarItemInfo を使用したりすることなく、タスクバーの進行状況アニメーションを WinForms アプリケーションに追加したかっただけです。

解決策は、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);
    }
}

使いやすさの例:

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

or

TaskbarProgress.SetValue(this.Handle, 50, 100);
TaskbarProgress.SetState(this.Handle, TaskbarProgress.TaskbarStates.Error);
于 2014-06-12T14:37:15.490 に答える
52

ドキュメントを読むのをスキップして、機能するものだけを入手したい人のために...

  • Microsoft .Net Framework 用の Windows API コード パックをダウンロードし ます。
  • zip ファイルを作成するインストーラーを実行します。
  • zip ファイルの binaries フォルダーから次の dll を抽出します。
    • Microsoft.WindowsAPICodePack.dll
    • Microsoft.WindowsAPICodePack.Shell.dll
  • プロジェクトにそれらへの参照を追加します
  • 次のコードをアプリに挿入し、必要に応じて変更します。

--

  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);
于 2013-06-21T20:41:32.843 に答える
39

Microsoft .Net Framework 用のWindows API コード パックを調べてください。

于 2009-08-18T19:16:20.417 に答える
5

はい、Microsoft は次のドキュメントで新しいタスクバー機能について説明しています (ソースを含む): Windows 7 タスクバー: 開発者向けリソース

于 2009-08-18T19:20:31.547 に答える
4

はい、この API を使用する必要があります。

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

于 2009-08-18T19:16:40.587 に答える
0

タスクバーの進行状況バーの問題に対する簡単な解決策を提供する美しい記事 (リンク) を見つけました。要約すると、MSDN Web サイトからWindows API パックをダウンロードし、そこに含まれる Microsoft.WindowsAPICodePack.Shell.dll への参照を追加し、最後に 3 行のコードをアプリケーションに追加するように指示されています。

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

ここで、X は表示する進行状況です。

于 2014-02-12T00:36:17.397 に答える