Как программно установить ориентацию приложения UWP - PullRequest
0 голосов
/ 17 июня 2019

Я разрабатываю приложение 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 без изменения ориентации отображения окон?

1 Ответ

0 голосов
/ 21 июня 2019

API AutoRotationPreferences , который вы использовали, предназначен для работы только в том случае, если устройство работает в режиме планшета, поэтому оно не работает на вашем устройстве. Можно настроить поворот экрана с помощью SetDisplayConfig из приложения Win32 при запуске, и я также сделаю несколько тестов для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...