Запуск приложения Windows Store из классического desktop приложения

160
19 ноября 2021, 15:10

Как из обычного классического desktop приложения написанного на C++ запустить приложение установленное из Windows Store? По аналогии с QProcess

Answer 1

Приложение UWP можно запустить, используя его зарегистрированный протокол:

system("explorer protocol://");

где protocol - имя одного из ключей реестра в разделе

HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\PackageRepository\Packages\(PackageID)\(AppUserModelID)\windows.protocol

Например:

calculator для стандартного калькулятора Windows

microsoft-edge для Microsoft Edge

Приложение Win32, запакованное для Windows Store, можно запустить обычным запуском его exe-файла.

Если приложение UWP не регистрирует ни одного протокола, его можно запустить через его зарегистрированные псевдонимы командной строки: Command-Line Activation of Universal Windows Apps.

Произвольное приложение можно запустить, используя IApplicationActivationManager::ActivateApplication. Пример кода для Visual C++ (требует Windows 8-10 SDK):

#include <stdlib.h> 
#include <stdio.h>
#include <shlobj.h>
#include <stdio.h>
#include <shobjidl.h>
#include <objbase.h>
#include <atlbase.h>
#include <string>
HRESULT LaunchApp(const std::wstring& strAppUserModelId, PDWORD pdwProcessId)
{
    CComPtr<IApplicationActivationManager> spAppActivationManager;
    HRESULT hrResult = E_INVALIDARG;
    if (!strAppUserModelId.empty())
    {
        // Instantiate IApplicationActivationManager
        hrResult = CoCreateInstance(CLSID_ApplicationActivationManager,
            NULL,
            CLSCTX_LOCAL_SERVER,
            IID_IApplicationActivationManager,
            (LPVOID*)&spAppActivationManager);
        if (SUCCEEDED(hrResult))
        {
            // This call ensures that the app is launched as the foreground window
            hrResult = CoAllowSetForegroundWindow(spAppActivationManager, NULL);
            // Launch the app
            if (SUCCEEDED(hrResult))
            {
                hrResult = spAppActivationManager->ActivateApplication(strAppUserModelId.c_str(),
                    NULL,
                    AO_NONE,
                    pdwProcessId);
            }
        }
    }
    return hrResult;
}

int main(void)
{       
    HRESULT hrResult = S_OK;
    if (SUCCEEDED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)))
    {
        DWORD dwProcessId;
        hrResult = LaunchApp(std::wstring(L"Microsoft.WindowsCalculator_8wekyb3d8bbwe!App"), &dwProcessId); //AppUserModelID для стандартного калькулятора
        if (FAILED(hrResult)) {
            wprintf(L"Failed with HRESULT 0x%x", (UINT)hrResult);
        }
        CoUninitialize();
    }
    getchar();
    return 0;
}

Источник: https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/7cf9693f-0b87-423f-8557-23b61a8c10cc/how-do-i-programmatically-launch-a-windows-store-app-from-my-desktop-app?forum=windowsgeneraldevelopmentissues

Для запуска необходим AppUserModelID, который можно найти поиском в реестре по упомянутому выше разделу PackageRepository (имя вложенного ключа) или разделам HKEY_CLASSES_ROOT\AppX(...)\Application (значение свойства AppUserModelID).

READ ALSO
Код шаблона в C++

Код шаблона в C++

Существует ли способ построить в классе группу "одинаковых" методов, но использующих каждый одно уникальное свойство/параметр, при помощи...

95
Как реализовать решение задачи ЕГЭ на C++?

Как реализовать решение задачи ЕГЭ на C++?

Возник такой вопрос: как реализовать решение следующей задачи на C++? Вводятся число N - количество строкВ каждой из N строк через пробел вводятся...

333
Как повысить привилегии приложения (UAC)

Как повысить привилегии приложения (UAC)

Делаю приложение, которое запускается на Windows 7/10 от пользователя с правами администратораПри этом запускается оно в обычном режиме (с ограниченными...

178
Почему std::vector.push_back(new struct()) работает медленнее чем std::vector.push_back(struct_item)

Почему std::vector.push_back(new struct()) работает медленнее чем std::vector.push_back(struct_item)

хочу хранить в векторе некоторые структуры,(много)Интересует вопрос почему такой код работает быстрее

191