single.php

C# WinUI3でタスクバーのアイコンにプログレスバーを表示する方法

C# WinUI 3アプリを作っていく途中で、調べたことを忘録的に投稿します。今回はWinUI3 プロジェクトで実行時に追加されるタスクバーのアイコン表示に進行状況をユーザーに伝えるプログレス表示を追加する方法です。

[ITaskbarList3]インターフェイス

以前(Windows7 くらいの時代)のWindowsにはタスクバーに追加されたアイコン部分を変化させてユーザーに[エラー]や[中断]などを伝える表示として利用されていました。

その表示の1つにダウンロードなどの処理の進行状況を伝えるプログレスバーをタスクバーに追加したアイコンに表示ができます。

WinUI3プロジェクトの場合は[ITaskbarList3]インターフェイスを通してタスクバーに表示されるアイコン部分にアクセスが可能です。

Xamlにイベントを発生させるためのボタンを追加。

<Grid HorizontalAlignment="Center" VerticalAlignment="Center">
  <Button Click="Button_Click">TaskBarInfo</Button>
</Grid>

クラスで[ITaskbarList3]インターフェイスを利用するための[ComImport]を追加します。

public enum TBPFLAG
{
  TBPF_NOPROGRESS = 0,
  TBPF_INDETERMINATE = 0x1,
  TBPF_NORMAL = 0x2,
  TBPF_ERROR = 0x4,
  TBPF_PAUSED = 0x8
}

[ComImport()]
[Guid("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
private interface ITaskbarList3
{
  [PreserveSig]
  void HrInit();
  [PreserveSig]
  void AddTab(IntPtr hwnd);
  [PreserveSig]
  void DeleteTab(IntPtr hwnd);
  [PreserveSig]
  void ActivateTab(IntPtr hwnd);
  [PreserveSig]
  void SetActiveAlt(IntPtr hwnd);
  [PreserveSig]
  void MarkFullscreenWindow(IntPtr hwnd, [MarshalAs(UnmanagedType.Bool)] bool fFullscreen);
  [PreserveSig]
  void SetProgressValue(IntPtr hwnd, UInt64 ullCompleted, UInt64 ullTotal);
  [PreserveSig]
  void SetProgressState(IntPtr hwnd, TBPFLAG tbpFlags);
}

[ComImport()]
[Guid("56fdf344-fd6d-11d0-958a-006097c9a090")]
[ClassInterface(ClassInterfaceType.None)]
private class TaskbarInstance
{
}

private static ITaskbarList3 taskbarList3 = (ITaskbarList3)new TaskbarInstance();

public static void SetTaskbarProgressValue(IntPtr hWnd, double value, double max)
{
  taskbarList3.SetProgressValue(hWnd, (ulong)value, (ulong)max);
}

最後に、追加したイベントにタスクバーにプログレス表示をするコードを追加します。

private void Button_Click(object sender, RoutedEventArgs e)
{
    IntPtr hWnd = WindowNative.GetWindowHandle(this);
    SetTaskbarProgressValue(hWnd, 75, 100);
}

実行後にイベント用のボタンをクリックします。

タスクバーに追加されたアプリのアイコン下部のバーがプログレス表示に変更されます。

[SetProgressValue]メソッドの第2引数が表示されるバーの長さになるので、数値を少なく変更すると

private void Button_Click(object sender, RoutedEventArgs e)
{
    IntPtr hWnd = WindowNative.GetWindowHandle(this);
    SetTaskbarProgressValue(hWnd, 25, 100);
}

表示されるバーも短くなります。

まとめ

今回は、短い記事ですが、WinUI3 プロジェクトで実行時に追加されるタスクバーのアイコン表示に進行状況をユーザーに伝えるプログレス表示を追加する方法について紹介しました。

Windows7/Vistaの時代、タスクバーに表示されるアイコンを利用してエラーや中断などアプリの状態をユーザーに伝える手段が追加されました。

その他にもプログレス表示を利用して、進行状況を伝える手段も用意されていました。

Windows11でも、Google Chromeのダウンロード状態などアイコン下部のバーで進行状況が表示されます。

WinUI3で利用する場合には[ITaskbarList3]インターフェイスを経由してタスクバーに表示されたアイコンにアクセスが可能です。

WinUI 3でタスクバーに表示されたアイコンにプログレスバーを表示したい人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です