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

Posted

技术标签:

【中文标题】如何以编程方式设置 UWP 应用的方向【英文标题】:How to set the orientation of a UWP app programmatically 【发布时间】:2019-06-17 09:51:12 【问题描述】:

我正在为可以从两侧访问的物理设备开发 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】:

您使用的 AutoRotationPreferences api 仅设计为在设备处于平板电脑模式时工作,因此在您的设备中不起作用。您可以考虑使用 SetDisplayConfig 设置屏幕旋转 来自启动时的 Win32 应用程序,我还将为此进行一些测试。

【讨论】:

以上是关于如何以编程方式设置 UWP 应用的方向的主要内容,如果未能解决你的问题,请参考以下文章

如何在UWP中以编程方式在设置中打开位置服务?

如何以编程方式退出或关闭 UWP 应用? (视窗 10)

如何以编程方式更改 Win 8.1 或 Win 10 UWP 应用的背景主题?

以编程方式更改应用程序语言 - UWP

以编程方式更改 Windows 10 UWP 应用程序中的主题

如何在iOS 7中以编程方式设置设备方向?