У нас есть чистое приложение Win32/C++, из которого мы хотим определить режим планшета в Windows 10.
У меня есть следующий код, который откуда-то взялся и использует WRL для доступа к свойству Windows.UI.ViewManagement.UIViewSettings.UserInteractionMode:
WRL::ComPtr<IUIViewSettingsInterop> interop;
if (SUCCEEDED(Windows::Foundation::GetActivationFactory(WRL::Wrappers::HStringReference(
RuntimeClass_Windows_UI_ViewManagement_UIViewSettings).Get(),
&interop)) && interop)
{
WRL::ComPtr<vm::IUIViewSettings> pViewSettings;
if (SUCCEEDED(interop->GetForWindow(hWnd, IID_PPV_ARGS(&pViewSettings))) && pViewSettings)
{
vm::UserInteractionMode currentMode;
if (SUCCEEDED(pViewSettings->get_UserInteractionMode(¤tMode)))
return currentMode == vm::UserInteractionMode::UserInteractionMode_Touch;
}
}
Это прекрасно работает, однако у нас также есть другая функция, использующая WinRT, и я понимаю, что WinRT — это текущая технология, которую мы должны использовать для этого, поэтому я пытался понять, как преобразовать код WRL.
Я придумал этот код, который компилируется нормально, но выдает исключение в GetForCurrentView():
auto uiSettings = winrt::Windows::UI::ViewManagement::UIViewSettings::GetForCurrentView();
return uiSettings.UserInteractionMode() == winrt::Windows::UI::ViewManagement::UserInteractionMode::Touch;
Ошибка HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND). Я предполагаю, что есть что-то, что я должен сделать для инициализации «текущего представления», подобно тому, как код WRL предоставляет дескриптор окна для GetForWindow, но я не смог понять, как и что это такое.





Благодаря @RaymondChen эквивалент C++/WinRT кода WRL в моем вопросе:
auto uiSettings = winrt::capture<winrt::Windows::UI::ViewManagement::UIViewSettings>
(winrt::get_activation_factory<winrt::Windows::UI::ViewManagement::UIViewSettings>()
.as<IUIViewSettingsInterop>(), &IUIViewSettingsInterop::GetForWindow, hWnd);
return uiSettings.UserInteractionMode() == winrt::Windows::UI::ViewManagement::UserInteractionMode::Touch;
В C++/WinRT шаги те же: получите фабрику активации, а затем вызовите IUIViewSettingsInterop::GetForWindow. C++/WinRT может сделать все это одной строкой:
auto uiSettings = winrt::capture<winrt::Windows::UI::ViewManagement::UIViewSettings>(winrt::get_activation_factory<winrt::Windows::UI::ViewManagement::UIViewSettings>().as<IUIViewSettingsInterop>(), &IUIViewSettingsInterop::GetForWindow, hWnd);