🗿

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

2021/08/06に公開

もくじ
https://qiita.com/tera1707/items/4fda73d86eded283ec4f

やりたいこと

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

情報の概要というのは、

  • アプリ名
  • AumID
  • アプリの状態(Running/Suspendなど)
  • アプリに属するプロセスの一覧
    • pid
    • exe名

のようなイメージ。

やり方

  • AppDiagnosticInfo
  • AppResourceGroupInfo
  • ProcessDiagnosticInfo

あたりのUWPのAPIを使う。

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

サンプルコード

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)
                                    {
                                        Console.WriteLine("  pid: {0}, exeName : {1}, IsPackaged : {2}", process.ProcessId, process.ExecutableFileName, process.IsPackaged);
                                    }
                                }
                            }
                        }
                    }
                }
                Thread.Sleep(5000);
            }
        }
    }
}

参考

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

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

Discussion