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でタスクバーに表示されたアイコンにプログレスバーを表示したい人の参考になれば幸いです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。