デスクトップ・UWP・WinUIのウインドウを見分ける

もくじ
https://tera1707.com/entry/2022/02/06/144447

やりたいこと

他人が作って自分のPCで動いているアプリのウインドウが、なにで出来ているのか(デスクトップアプリなのか、UWPなのか、WinUI3なのか)を知りたい。

以前、この記事で勉強した奴がほぼそのまんま使えそうなので、それを流用してやってみる。

サンプルコード

これで、とりあえず↑の3種類は判別できてるっぽい。
(試した限りはできてそうだが、どんなアプリがきても大丈夫かは自信なし。)

#include <windows.h>
#include <iostream>
#include <string>
#include <locale.h>

std::wstring GetWindowKind(std::wstring className)
{
    if (className == L"ApplicationFrameWindow")
    {
        return std::wstring(L"uwp1");
    }
    else if (className == L"Windows.UI.Core.CoreWindow")
    {
        return std::wstring(L"uwp2");
    }
    else if (className == L"WinUIDesktopWin32WindowClass")
    {
        return std::wstring(L"winui3");
    }
    else if (className != L"ApplicationFrameWindow")
    {
        return std::wstring(L"desktop");
    }
}

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lp)
{
    auto textLen = GetWindowTextLength(hwnd);

    if (textLen > 0)
    {
        if (!IsWindowVisible(hwnd)) return TRUE;

        WCHAR buf[256] = { 0 };
        GetWindowText(hwnd, buf, sizeof(buf) / sizeof(buf[0]));
        auto title = std::wstring(buf);

        GetClassName(hwnd, buf, sizeof(buf) / sizeof(buf[0]));
        auto titlclassName = std::wstring(buf);

        auto windowKind = GetWindowKind(std::wstring(buf));

        std::wcout << windowKind << L" : " << titlclassName << L"    " << title << std::endl;
    }
    return TRUE;
}

int main()
{
    setlocale(LC_ALL, "Japanese");

    EnumWindows(EnumWindowsProc, NULL);
}

結果

C:\git\Cpp\MinimizeRestoreAllWindows\x64\Debug\ConsoleApplication1.exe
desktop : HwndWrapper[DefaultDomain;;1a586933-0141-43a3-9f2d-a78566ae658d]    WindowsProject1
desktop : HwndWrapper[DefaultDomain;;7014cab9-0aff-4641-b767-c2033fae88a4]    WindowsProject1 - Microsoft Visual Studio
desktop : HwndWrapper[DefaultDomain;;6d68703f-4fe3-4ff0-8e66-d78c68929e49]    WindowsProject1 - ConsoleApplication1.cpp
desktop : Chrome_WidgetWin_1    ブログ記事編集 - はてなブログ - Google Chrome
desktop : HwndWrapper[MicrosoftWhiteboard.exe;;1a3f6e61-411b-423d-9d06-b92aae8fa2a1]    Microsoft Whiteboard
uwp1 : ApplicationFrameWindow    電卓
winui3 : WinUIDesktopWin32WindowClass    WinUI 3 Gallery
uwp2 : Windows.UI.Core.CoreWindow    設定
uwp1 : ApplicationFrameWindow    設定
uwp2 : Windows.UI.Core.CoreWindow    Windows 入力エクスペリエンス
desktop : Progman    Program Manager

↑のコードの問題

「設定」などの、今ウインドウを表示していないUWPのアプリまで取れてしまう。

これ何とかならないか?(最小化でもない、見えないUWPアプリは間引けないか?)

参考

似たようなことをしたときの記事
全ウインドウ(UWP/DESKTOP)を最小化する/元に戻す

https://qiita.com/tera1707/private/e69cf13a05be16b230b7

UWPのアプリ一覧を取る方法
UWPのほうは、こっちで取る?

https://zenn.dev/tera1707/articles/cb37efb4e5fb3a