🗿

[WPF/C#] UWPアプリの一覧とアプリの詳細を表示する

2021/08/06に公開

もくじ

https://qiita.com/tera1707/items/4fda73d86eded283ec4f

やりたいこと

UWPのAPIを使って、UWPアプリの一覧と、アプリの情報の詳細をとりたい。

情報の詳細というのは、
以前の記事(UWPアプリの一覧とアプリの概要を表示する)の情報に加え、

  • アプリに属するプロセスの
    • CPU時間
    • メモリ使用量(Workingset)
    • ディスク使用量(RWバイト数/RWの数)

の情報をとるイメージ。

やり方

  • ProcessDiagnosticInfo

の中の

  • CpuUsage
  • MemoryUsage

あたりのUWPのAPIを使う。

必要nugetライブラリ
Microsoft.Windows.SDK.Contracts
(今回は10.0.19041.1を使用)

サンプルコード

foreach (ProcessDiagnosticInfo process in processes)のループの中身以外は、前回の記事と同じ内容。

using System;
using System.Collections.Generic;
using System.Threading;
using Windows.System;
using Windows.System.Diagnostics;

namespace ProcessListUpByUwpApi
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                Console.Clear();

                // アプリの診断情報を取得
                var infoOperation = AppDiagnosticInfo.RequestInfoAsync();
                var infoTask = infoOperation.AsTask();
                infoTask.Wait();
                var uwpApps = infoTask.Result;// UWPアプリの一覧

                if (uwpApps != null)
                {
                    foreach (AppDiagnosticInfo app in uwpApps)
                    {
                        Console.WriteLine("app: {0}, AumId: {1}", app.AppInfo.DisplayInfo.DisplayName, app.AppInfo.AppUserModelId);

                        // アプリのリソースグループを取得(メモリ使用量、エネルギー使用量など)
                        // ※Listが取れるが、どういうときにリストに2つ以上のAppResourceGroupInfoが入るかは不明...
                        IList<AppResourceGroupInfo> groups = app.GetResourceGroups();
                        if (groups != null)
                        {
                            foreach (AppResourceGroupInfo group in groups)
                            {
                                var state = group.GetStateReport();

                                Console.WriteLine(" executeStatus : {0}, EnergyQuotaState : {1}", state.ExecutionState, state.EnergyQuotaState);

                                // アプリに属するプロセスの情報を取得(PID、CPU時間、メモリ使用量など)
                                IList<ProcessDiagnosticInfo> processes = group.GetProcessDiagnosticInfos();
                                if (processes != null)
                                {
                                    foreach (ProcessDiagnosticInfo process in processes)
                                    {
                                        var cpu = process.CpuUsage.GetReport();
                                        var cputime = cpu.UserTime + cpu.KernelTime;

                                        var memory = process.MemoryUsage.GetReport();
                                        var workingset = memory.WorkingSetSizeInBytes;

                                        var disk = process.DiskUsage.GetReport();
                                        var rwBytes = disk.BytesWrittenCount + disk.BytesReadCount;

                                        Console.WriteLine("  pid: {0}, exeName : {1}, IsPackaged : {2}, cpuTime : {3}, workingSet : {4}, diskRW : {5}", process.ProcessId, process.ExecutableFileName, process.IsPackaged, cputime, workingset, rwBytes);
                                    }
                                }
                            }
                        }
                    }
                }
                Thread.Sleep(5000);
            }
        }
    }
}

参考

MSのサンプル
(UWPの一覧を表示するアプリ。UWP版のタスクマネージャみたいなもの)

https://github.com/microsoft/AppModelSamples/tree/master/Samples/UWPTaskMonitor

Discussion