How to get the “Application Name” from hWnd for Windows 10 Store Apps (e.g. Edge)

前端 未结 5 1715
清歌不尽
清歌不尽 2020-12-31 13:28

I\'m trying to get an understandable \"Process Name\" for Windows 10 apps. Currently, all of them use ApplicationFrameHost, so I thought I could use either the

5条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-31 13:43

    So first of all there is a thing called AppUserModelID, it's ID of window that is used by taskbar to group windows. Because all WinRT windows are from same process but they aren't grouped, it means that each app has own UserModelID.

    To get UserModelID from HWND you can use method from this answer.

    #include "Propsys.h"
    #include 
    
    #pragma comment (lib, "Shell32.lib")
    
    //.........
    
    IPropertyStore* propStore;
    
    auto weatherWnd = FindWindow(L"ApplicationFrameWindow", L"Weather");
    SHGetPropertyStoreForWindow(weatherWnd, IID_IPropertyStore, (void**)&propStore);
    
    PROPVARIANT prop;
    propStore->GetValue(PKEY_AppUserModel_ID, &prop);
    

    And prop will contain value LPWSTR = 0x00838f68 L"Microsoft.BingWeather_8wekyb3d8bbwe!App". This is full entry point name in format !. Entry point for launched apps usually called App. Entry points are defined in app manifest.

    Also interesting thing - child window that is owned by app is not destroyed, but is moved away from app frame host into desktop window. I don't know why it happens, but you must be careful because FindWindow(nullptr, L"Weather") returned child app window and not appframehost window.

    P.S. AppUserModelID is just a string and it's format is not documented, so this method is not exactly the most reliable one.

    P.P.S. Also I noticed that you want to have icon and name, you can use PackageManager for that, it requires you to reference winmd assembly, how to do this look here

提交回复
热议问题