Dela via


Implementera 3D-appstartare (Win32-appar)

Anteckning

Den här funktionen är endast tillgänglig för datorer som kör de senaste Windows Insider-flygningarna (RS5), version 17704 och senare.

Den Windows Mixed Reality hem är startpunkten där användarna landar innan de startar program. Som standard måste du starta integrerande Win32 VR-appar och spel utanför headsetet och visas inte i listan "Alla appar" på Windows Mixed Reality Start-menyn. Om du följer anvisningarna i den här artikeln för att implementera en 3D-appstartare kan din integrerande Win32 VR-upplevelse startas från Windows Mixed Reality Start-menyn och hemmiljön.

Detta gäller endast för integrerande Win32 VR-upplevelser som distribueras utanför Steam. För VR-upplevelser som distribueras via Steam har vi uppdaterat Windows Mixed Reality för SteamVR Beta tillsammans med de senaste Windows Insider RS5-flygningarna så att SteamVR-titlar visas på Windows Mixed Reality Start-menyn i listan "Alla appar" automatiskt med hjälp av en standardstartare. Med andra ord är metoden som beskrivs i den här artikeln onödig för SteamVR-titlar och kommer att åsidosättas av Windows Mixed Reality för SteamVR Beta-funktioner.

Skapandeprocess för 3D-appstartare

Det finns tre steg för att skapa en 3D-appstartare:

  1. Design och koncept
  2. Modellering och export
  3. Integrera den i ditt program (den här artikeln)

3D-tillgångar som ska användas som startprogram för ditt program bör skapas med hjälp av Windows Mixed Reality redigeringsriktlinjer för att säkerställa kompatibilitet. Tillgångar som inte uppfyller den här redigeringsspecifikationen återges inte i Windows Mixed Reality hem.

Konfigurera 3D-startprogrammet

Win32-program visas i listan "Alla appar" på Windows Mixed Reality Start-menyn om du skapar en 3D-appstart för dem. Det gör du genom att skapa en XML-fil för manifestet för visuella element som refererar till 3D-appstartaren genom att följa dessa steg:

  1. Skapa en GLB-fil för 3D App Launcher-tillgångar (se Modellering och export).
  2. Skapa ett manifest för visuella element för ditt program.
    1. Du kan börja med exemplet nedan. Mer information finns i den fullständiga dokumentationen för visualiseringsmanifestet .
    2. Uppdatera Square150x150Logo och Square70x70Logo med en PNG/JPG/GIF för din app.
      • Dessa används för appens 2D-logotyp i listan Windows Mixed Reality Alla appar och för Start-menyn på skrivbordet.
      • Filsökvägen baseras på mappen som innehåller manifestet för visuella element.
      • Du måste fortfarande ange en startmenyikon för skrivbordet för din app via standardmekanismerna. Detta kan antingen vara direkt i den körbara filen eller i genvägen som du skapar. Till exempel via IShellLink::SetIconLocation.
      • Valfri: Du kan använda en resources.pri-fil om du vill att MRT ska tillhandahålla flera tillgångsstorlekar för olika upplösningsskalor och högkontrasttteman.
    3. Uppdatera MixedRealityModel-sökvägen så att den pekar på GLB för 3D-appstartaren
    4. Spara filen med samma namn som den körbara filen med filnamnstillägget ".VisualElementsManifest.xml" och spara den i samma katalog. För den körbara filen "contoso.exe" heter till exempel den medföljande XML-filen "contoso.visualelementsmanifest.xml".
  3. Lägg till en genväg till ditt program på Windows Start-menyn på skrivbordet. Se exemplet nedan för ett exempel på en C++-implementering.
    • Skapa den i %ALLUSERSPROFILE%\Microsoft\Windows\Start-menyn\Program (dator) eller %APPDATA%\Microsoft\Windows\Start-menyn\Program (användare)
    • Om en uppdatering ändrar manifestet för visuella element eller de tillgångar som den refererar till, bör uppdateringsverktyget eller installationsprogrammet uppdatera genvägen så att manifestet returneras och cachelagrade tillgångar uppdateras.
  4. Valfri: Om genvägen till skrivbordet inte pekar direkt på programmets EXE (till exempel om den anropar en anpassad protokollhanterare som "myapp://") hittar inte Start-menyn automatiskt appens VisualElementsManifest.xml-fil. För att lösa detta bör genvägen ange filsökvägen för manifestet för visuella element med hjälp av System.AppUserModel.VisualElementsManifestHintPath (). Detta kan anges i genvägen med samma tekniker som System.AppUserModel.ID. Du behöver inte använda System.AppUserModel.ID men du kan göra det om du vill att genvägen ska matcha det explicita programanvändarmodell-ID:t för programmet om det används. Se avsnittet om att skapa genvägar för startprogrammet nedan för ett C++-exempel.

Manifest för visuella exempelelement

<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>

Exempel på genväg till startprogrammet

Exempelkoden nedan visar hur du kan skapa en genväg i C++, inklusive att åsidosätta sökvägen till XML-filen manifest för visuella element. Observera att åsidosättningen endast krävs i fall där genvägen inte pekar direkt på DEN EXE som är associerad med manifestet (till exempel använder genvägen en anpassad protokollhanterare som "myapp://").

Prov. Skapa LNK-genväg (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;
}

Prov. Genväg till URL-start

[{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

Se även