如何以编程方式设置UWP应用的方向

时间:2019-06-17 09:51:12

标签: c++ windows visual-studio uwp windows-10-universal

我正在为可从两侧访问的物理设备开发UWP应用程序(显示屏朝上)。默认方向是“横向”,我希望能够以编程方式翻转(旋转180°)应用程序的方向。

我已经尝试了两种不同的方法:

1。使用Win32 API更改Windows显示方向

为此,您需要使用user32.lib中包含的API函数,该函数无法完成/不允许UWP应用程序使用。因此,我编写了一个可以从UWP应用程序触发的单独程序。在这里,您可以看到如何根据this question随附的代码实现显示方向:

#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);
}

这有效,但是当我在Windows 10的Kiosk模式下运行UWP应用程序(如我们打算做的那样)时,它会在旋转后隐藏该应用程序,如果我之前与UI进行交互则显示空白屏幕(不知道为什么这样做)要么发生,对我来说似乎是个错误)。如果我不与UI进行交互,则旋转效果很好,但这不是解决方案...

2。使用DXGI交换链来旋转应用程序?

搜寻解决方案时,我很快遇到了IDXGISwapChain1::SetRotation,也发现了this example program。但这似乎不是一个简单的UWP用户界面的正确解决方案,因为我们需要使用DirectX来实现UI。如果我错了,请纠正我。

3。更改AutoRotationPreferences

我也尝试在按下按钮时执行以下命令,但是它什么也没做:

DisplayInformation^ displayInformation = DisplayInformation::GetForCurrentView();
displayInformation->AutoRotationPreferences = DisplayOrientations::LandscapeFlipped;

是否可以在不更改窗口显示方向的情况下强制UWP应用定向?

1 个答案:

答案 0 :(得分:0)

您使用的 AutoRotationPreferences API仅在设备处于平板电脑模式下才能工作,因此不适用于您的设备。您可以考虑使用 SetDisplayConfig设置屏幕旋转(在启动时使用Win32应用程序),我还将为此做一些测试。