Я разрабатываю приложение UWP для физического устройства, к которому можно получить доступ с двух сторон (дисплей направлен вверх). Ориентация по умолчанию - Пейзаж, и я хотел бы иметь возможность перевернуть (повернуть на 180 °) программную ориентацию приложения.
Я уже пробовал две разные вещи:
1. Изменить ориентацию экрана Windows с помощью Win32 API
Для этого вам нужно использовать функции API, содержащиеся в user32.lib, что нельзя сделать / не разрешено из приложения UWP. Поэтому я написал отдельную программу, которая может быть запущена из приложения UWP. Здесь вы можете увидеть, как я реализовал ориентацию дисплея на основе кода, поставляемого с этим вопросом :
#include <windows.h>
bool SetDisplayOrientation(bool flip) {
int index = 0;
DISPLAY_DEVICE dd;
dd.cb = sizeof(DISPLAY_DEVICE);
while (EnumDisplayDevices(NULL, index++, &dd, 0) && !(dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE));
DEVMODE dm;
ZeroMemory(&dm, sizeof(dm));
dm.dmSize = sizeof(DEVMODE);
if (!EnumDisplaySettings(dd.DeviceName, ENUM_CURRENT_SETTINGS, &dm)) {
return false;
}
dm.dmDisplayOrientation = flip ? DMDO_180 : DMDO_DEFAULT;
dm.dmFields = (DM_DISPLAYORIENTATION);
if (ChangeDisplaySettings(&dm, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) {
return false;
}
return (ChangeDisplaySettings(&dm, 0) == DISP_CHANGE_SUCCESSFUL);
}
Это работает, но когда я запускаю приложение UWP в режиме киоска Windows 10 (как мы и собираемся сделать), оно поворачивает приложение после поворота, показывая пустой экран, если я взаимодействовал с пользовательским интерфейсом раньше (не знаю, почему бывает либо, похоже на ошибку мне). Если бы я не взаимодействовал с пользовательским интерфейсом, вращение работает нормально, но это не решение ...
2. Использовать цепочку обмена DXGI для вращения приложения?
Поиск в поиске решений Я быстро наткнулся на IDXGISwapChain1 :: SetRotation , а также обнаружил этот пример программы . Но все это вместе, кажется, не является правильным решением для простого пользовательского интерфейса UWP, поскольку нам нужно было бы реализовать наш пользовательский интерфейс с использованием DirectX. Пожалуйста, поправьте меня, если я ошибаюсь.
3. Изменить параметры автоповорота
Я также попытался выполнить следующую команду при нажатии кнопки, но она ничего не сделала:
DisplayInformation^ displayInformation = DisplayInformation::GetForCurrentView();
displayInformation->AutoRotationPreferences = DisplayOrientations::LandscapeFlipped;
Есть ли способ принудительно настроить ориентацию приложения UWP без изменения ориентации отображения окон?