もくじ
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のほうは、こっちで取る?