如何以编程方式设置 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 应用的方向的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式更改 Win 8.1 或 Win 10 UWP 应用的背景主题?