Использование смешанной реальности Windows в приложениях, отличных от UWP
Я поддерживаю приложение C# WPF и хочу добавить в него поддержку Windows Mixed Reality.
Перенос приложения на UWP, вероятно, не очень хорошая идея, так как приложение поддерживает множество других API, которые не имеют своих вариантов UWP. Например, поддержка Oculus, OSVR и OpenVR(Vive). У меня недостаточно опыта UWP, чтобы быть уверенным.
Итак, есть ли идея, если вообще возможно использовать API-интерфейсы UWP смешанной реальности в приложениях, отличных от UWP? Или, может быть, портирование промежуточного API на UWP не так уж страшно?
1 ответ
Вы также можете реализовать интерфейс на C#, если хотите получить к нему доступ из своих проектов WPF/winforms. Чтобы использовать приведенный ниже код, добавьте ссылку на пакет nuget Microsoft.Windows.SDK.Contracts, например: https://www.nuget.org/packages/Microsoft.Windows.SDK.Contracts/10.0.18362.2002-preview
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Text;
using Windows.UI.Input.Spatial;
namespace UWPInterop
{
//MIDL_INTERFACE("5C4EE536-6A98-4B86-A170-587013D6FD4B")
//ISpatialInteractionManagerInterop : public IInspectable
//{
//public:
// virtual HRESULT STDMETHODCALLTYPE GetForWindow(
// /* [in] */ __RPC__in HWND window,
// /* [in] */ __RPC__in REFIID riid,
// /* [iid_is][retval][out] */ __RPC__deref_out_opt void** spatialInteractionManager) = 0;
//};
[System.Runtime.InteropServices.Guid("5C4EE536-6A98-4B86-A170-587013D6FD4B")]
[System.Runtime.InteropServices.InterfaceType(System.Runtime.InteropServices.ComInterfaceType.InterfaceIsIInspectable)]
interface ISpatialInteractionManagerInterop
{
SpatialInteractionManager GetForWindow(IntPtr Window, [System.Runtime.InteropServices.In] ref Guid riid);
}
//Helper to initialize SpatialInteractionManager
public static class SpatialInteractionManagerInterop
{
public static SpatialInteractionManager GetForWindow(IntPtr hWnd)
{
ISpatialInteractionManagerInterop spatialInteractionManagerInterop = (ISpatialInteractionManagerInterop)WindowsRuntimeMarshal.GetActivationFactory(typeof(SpatialInteractionManager));
Guid guid = typeof(SpatialInteractionManager).GUID;
return spatialInteractionManagerInterop.GetForWindow(hWnd, ref guid);
}
}
}
К сожалению, API-интерфейсы Mixed Reality встроены в платформу UWP, и для запуска MR необходимо, чтобы они были в приложении UWP. Единственный другой способ - создать проект как приложение Steam VR, но я не думаю, что это совместимо с тем, чего вы пытаетесь достичь.
Мой лучший совет - попытаться сделать ваш проект максимально кроссплатформенным. Поместить всю свою логику в проект Netcore / PCL и иметь два разных уровня пользовательского интерфейса для WPF и UWP в отдельных проектах.
Да, API-интерфейс UWP можно использовать в любом приложении, отличном от UWP, поскольку весь API-интерфейс UWP на самом деле является COM. Я обычно предпочитаю использовать C++ / WinRT, но у него есть ограничение в языке C++17.
Если ограничение неприемлемо для вас, вы можете использовать классический COM, как
Microsoft::WRL::ComPtr<ABI::Windows::UI::Input::Spatial::ISpatialInteractionManagerStatics> interactionManagerStatic;
Windows::Foundation::GetActivationFactory(
Microsoft::WRL::Wrappers::HStringReference(InterfaceName_Windows_UI_Input_Spatial_ISpatialInteractionManagerStatics).Get(),
&interactionManagerStatic);
Microsoft::WRL::ComPtr<ABI::Windows::UI::Input::Spatial::ISpatialInteractionManager> interactionManager;
if (FAILED(interactionManagerStatic->GetForCurrentView(interactionManager.GetAddressOf())))
{
return -1;
}