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

How to set the orientation of a UWP app programmatically

本文关键字:UWP 应用 方向 设置 方式 编程      更新时间:2023-10-16

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

我已经尝试了两种不同的东西:

1. 使用 Win32 API 更改窗口显示方向

为此,您需要使用 user32.lib 中包含的 API 函数,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);
}

这有效,但是当我在 Windows 10 的展台模式下运行 UWP 应用程序时(正如我们打算这样做的那样),它会在旋转后隐藏应用程序,如果我之前与 UI 交互,则会显示空白屏幕(不知道为什么会发生这种情况,对我来说看起来像一个错误)。如果我没有与 UI 交互,旋转工作得很好,但这不是解决方案......

2. 使用 DXGI 交换链旋转应用?

在谷歌上搜索解决方案时,我很快就遇到了IDXGISwapChain1::SetRotation,也找到了这个示例程序。但是,所有这些似乎不是简单UWP用户界面的正确解决方案,因为我们需要使用DirectX实现我们的UI。如果我在这里错了,请纠正我。

3.更改自动旋转首选项

我还尝试在按下按钮时执行以下命令,但它没有执行任何操作:

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

有没有办法在不更改窗口显示方向的情况下强制 UWP 应用的方向?

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