Sdílet prostřednictvím


Implementace spouštěčů 3D aplikací (aplikace Win32)

Poznámka

Tato funkce je dostupná jenom pro počítače s nejnovějšími testovacími verzemi programu Windows Insider (RS5), buildem 17704 a novějšími.

Domovská Windows Mixed Reality je výchozím bodem, kam uživatelé přistanou před spuštěním aplikací. Ve výchozím nastavení musíte spouštět imerzivní aplikace a hry Win32 VR mimo náhlavní soupravu a nezobrazí se v seznamu "Všechny aplikace" v Windows Mixed Reality nabídce Start. Pokud budete postupovat podle pokynů v tomto článku a implementovat spouštěč 3D aplikací, můžete své imerzivní prostředí Win32 VR spustit z nabídky Start Windows Mixed Reality a z domovského prostředí.

To platí pouze pro imerzivní prostředí Win32 VR distribuované mimo Steam. U virtuální reality distribuované prostřednictvím služby Steam jsme aktualizovali Windows Mixed Reality pro SteamVR Beta spolu s nejnovějšími testovacími verzemi programu Windows Insider RS5 tak, aby se tituly platformy SteamVR zobrazovaly v nabídce Start Windows Mixed Reality v seznamu "Všechny aplikace" automaticky pomocí výchozího spouštěče. Jinými slovy, metoda popsaná v tomto článku je pro názvy platformy SteamVR nepotřebná a bude přepsána Windows Mixed Reality pro funkci SteamVR Beta.

Proces vytváření spouštěče 3D aplikací

Vytvoření spouštěče 3D aplikací probíhá ve třech krocích:

  1. Návrh a koncepce
  2. Modelování a export
  3. Integrace do aplikace (tento článek)

3D prostředky, které se mají použít jako spouštěče pro vaši aplikaci, by měly být vytvořené pomocí Windows Mixed Reality pokynů pro vytváření, aby byla zajištěna kompatibilita. Prostředky, které nesplňují tuto specifikaci vytváření, se na domovské stránce Windows Mixed Reality nevykreslí.

Konfigurace 3D spouštěče

Aplikace Win32 se zobrazí v seznamu Všechny aplikace v nabídce Start Windows Mixed Reality, pokud pro ně vytvoříte spouštěč 3D aplikací. Chcete-li to provést, vytvořte soubor XML manifestu visual elements odkazující na spouštěč aplikací 3D pomocí následujících kroků:

  1. Vytvořte soubor GLB assetu 3D Spouštěče aplikací (viz Modelování a export).
  2. Vytvořte manifest vizuálních prvků pro vaši aplikaci.
    1. Můžete začít s ukázkou níže. Další podrobnosti najdete v úplné dokumentaci k manifestu visual elements .
    2. Aktualizujte protokoly Square150x150 a Square70x70Logo o formát PNG/JPG/GIF pro vaši aplikaci.
      • Použije se pro 2D logo aplikace v seznamu Windows Mixed Reality Všechny aplikace a pro nabídku Start na ploše.
      • Cesta k souboru je založená na složce obsahující manifest visual elements.
      • Stále je potřeba poskytnout aplikaci ikonu nabídky Start na ploše prostřednictvím standardních mechanismů. Může to být buď přímo ve spustitelném souboru, nebo ve vytvořeném zástupci. Například prostřednictvím IShellLink::SetIconLocation.
      • Volitelné: Soubor resources.pri můžete použít, pokud chcete, aby funkce MRT poskytovala více velikostí prostředků pro různé škály rozlišení a motivy s vysokým kontrastem.
    3. Aktualizujte cestu MixedRealityModel tak, aby odkazovala na GLB pro spouštěč 3D aplikací.
    4. Uložte soubor se stejným názvem jako spustitelný soubor s příponou .VisualElementsManifest.xml a uložte ho do stejného adresáře. Například pro spustitelný soubor "contoso.exe" má doprovodný soubor XML název "contoso.visualelementsmanifest.xml".
  3. Přidejte zástupce aplikace na plochu v nabídce Start systému Windows. Příklad implementace C++ najdete v ukázce níže .
    • Vytvořte ho ve složce %ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs (počítač) nebo %APPDATA%\Microsoft\Windows\Start Menu\Programs (uživatel)
    • Pokud aktualizace změní manifest vizuálních prvků nebo prostředky, na které odkazuje, aktualizátor nebo instalační program by měl aktualizovat zástupce tak, aby byl manifest reparsován a prostředky v mezipaměti aktualizovány.
  4. Volitelné: Pokud zástupce na ploše neukazuje přímo na soubor EXE vaší aplikace (například pokud vyvolá vlastní obslužnou rutinu protokolu jako "myapp://"), nabídka Start automaticky nenajde soubor VisualElementsManifest.xml aplikace. Pokud chcete tento problém vyřešit, zástupce by měl určit cestu k souboru manifestu visual elements pomocí System.AppUserModel.VisualElementsManifestHintPath (). To se dá nastavit ve zkratce pomocí stejných postupů jako System.AppUserModel.ID. Nemusíte používat System.AppUserModel.ID ale můžete to udělat, pokud chcete, aby zástupce odpovídal explicitnímu ID modelu uživatele aplikace, pokud se používá. Ukázku jazyka C++ najdete níže v části věnované vytvoření zástupce spouštěče ukázkových aplikací .

Manifest ukázkových vizuálních prvků

<Application xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <VisualElements
    ShowNameOnSquare150x150Logo="on"
    Square150x150Logo="YOUR_APP_LOGO_150X150.png"
    Square70x70Logo=" YOUR_APP_LOGO_70X70.png"
    ForegroundText="light"
    BackgroundColor="#000000">
    <MixedRealityModel Path="YOUR_3D_APP_LAUNCHER_ASSET.glb">
        <SpatialBoundingBox Center="0,0,0" Extents="Auto" />
    </MixedRealityModel>
  </VisualElements>
</Application>

Vytvoření zástupce ukázkového spouštěče aplikací

Následující ukázkový kód ukazuje, jak můžete vytvořit zástupce v jazyce C++, včetně přepsání cesty k souboru XML manifestu visual elements. Všimněte si, že přepsání je vyžadováno pouze v případech, kdy zástupce neukazuje přímo na soubor EXE přidružený k manifestu (například zástupce používá vlastní obslužnou rutinu protokolu, například "myapp://").

Ukázka. Vytvoření zástupce LNK (C++)

#include <windows.h>
#include <propkey.h>
#include <shlobj_core.h>
#include <shlwapi.h>
#include <propvarutil.h>
#include <wrl.h>

#include <memory>

using namespace Microsoft::WRL;

#define RETURN_IF_FAILED(x) do { HRESULT hr = x; if (FAILED(hr)) { return hr; } } while(0)
#define RETURN_IF_WIN32_BOOL_FALSE(x) do { DWORD res = x; if (res == 0) { return HRESULT_FROM_WIN32(GetLastError()); } } while(0)

int wmain()
{
    RETURN_IF_FAILED(CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED));

    ComPtr<IShellLink> shellLink;
    RETURN_IF_FAILED(CoCreateInstance(__uuidof(ShellLink), nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&shellLink)));
    RETURN_IF_FAILED(shellLink->SetPath(L"MyLauncher://launch/app-identifier"));

    // It is also possible to use an icon file in another location. For example, "C:\Program Files (x86)\MyLauncher\assets\app-identifier.ico".
    RETURN_IF_FAILED(shellLink->SetIconLocation(L"C:\\Program Files (x86)\\MyLauncher\\apps\\app-identifier\\game.exe", 0 /*iIcon*/));

    ComPtr<IPropertyStore> propStore;
    RETURN_IF_FAILED(shellLink.As(&propStore));

    {
        // Optional: If the application has an explict Application User Model ID, then you should usually specify it in the shortcut.
        PROPVARIANT propVar;
        RETURN_IF_FAILED(InitPropVariantFromString(L"ExplicitAppUserModelID", &propVar));
        RETURN_IF_FAILED(propStore->SetValue(PKEY_AppUserModel_ID, propVar));
        PropVariantClear(&propVar);
    }

    {
        // A hint path to the manifest is only necessary if the target path of the shortcut is not a file path to the executable.
        // By convention the manifest is named <executable name>.VisualElementsManifest.xml and is in the same folder as the executable
        // (and resources.pri if applicable). Assets referenced by the manifest are relative to the folder containing the manifest.

        //
        // PropKey.h
        //
        //  Name:     System.AppUserModel.VisualElementsManifestHintPath -- PKEY_AppUserModel_VisualElementsManifestHintPath
        //  Type:     String -- VT_LPWSTR  (For variants: VT_BSTR)
        //  FormatID: {9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}, 31
        //  
        //  Suggests where to look for the VisualElementsManifest for a Win32 app
        //
        // DEFINE_PROPERTYKEY(PKEY_AppUserModel_VisualElementsManifestHintPath, 0x9F4C2855, 0x9F79, 0x4B39, 0xA8, 0xD0, 0xE1, 0xD4, 0x2D, 0xE1, 0xD5, 0xF3, 31);
        // #define INIT_PKEY_AppUserModel_VisualElementsManifestHintPath { { 0x9F4C2855, 0x9F79, 0x4B39, 0xA8, 0xD0, 0xE1, 0xD4, 0x2D, 0xE1, 0xD5, 0xF3 }, 31 }

        PROPVARIANT propVar;
        RETURN_IF_FAILED(InitPropVariantFromString(L"C:\\Program Files (x86)\\MyLauncher\\apps\\app-identifier\\game.visualelementsmanifest.xml", &propVar));
        RETURN_IF_FAILED(propStore->SetValue(PKEY_AppUserModel_VisualElementsManifestHintPath, propVar));
        PropVariantClear(&propVar);
    }

    constexpr PCWSTR shortcutPath = L"%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\game.lnk";
    const DWORD requiredBufferLength = ExpandEnvironmentStrings(shortcutPath, nullptr, 0);
    RETURN_IF_WIN32_BOOL_FALSE(requiredBufferLength);

    const auto expandedShortcutPath = std::make_unique<wchar_t[]>(requiredBufferLength);
    RETURN_IF_WIN32_BOOL_FALSE(ExpandEnvironmentStrings(shortcutPath, expandedShortcutPath.get(), requiredBufferLength));

    ComPtr<IPersistFile> persistFile;
    RETURN_IF_FAILED(shellLink.As(&persistFile));
    RETURN_IF_FAILED(persistFile->Save(expandedShortcutPath.get(), FALSE));

    return 0;
}

Ukázka. Zástupce spouštěče adres URL

[{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}]
Prop31=C:\Program Files (x86)\MyLauncher\apps\app-identifier\game.visualelementsmanifest.xml
Prop5=ExplicitAppUserModelID

[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,0

[InternetShortcut]
IDList=
URL=MyLauncher://launch/app-identifier
IconFile=C:\Program Files (x86)\MyLauncher\apps\app-identifier\game.exe
IconIndex=0

Viz také