平板模式
概述
平板模式是 Windows 10 中提供的一种新自适应用户体验,可根据物理外形规格和客户的使用偏好优化应用和 Windows shell 的外观与行为。 本文档介绍如何在二合一设备和平板电脑上实现平板模式,特别是如何切换进入和退出“平板模式”。
使用平板模式功能,可将设备体验在平板模式与桌面设备模式之间来回切换。 用户进入和退出“平板模式”的主要方式是在操作中心单击任务栏右下角的图标。 此外,OEM 可以报告硬件转换(例如,将二合一设备从翻盖模式转换为平板模式,或反之),从而实现两种模式之间的自动切换。 不过,平板模式的一项关键承诺是用户始终可以控制他们自己的体验,因此这些硬件转换是通过必须由用户确认的 toast 提示操作的。 用户还可以选择设置默认响应。
目标设备
平板电脑 | 可分离电脑 | 变形本 |
可以对接外部监视器 + 键盘 + 鼠标的纯平板电脑和设备。 | 具有定制可拆卸键盘的类似于平板电脑的设备。 | 具有可折叠或旋转键盘的类似于笔记本电脑的设备。 |
当设备切换到平板模式时,会发生以下情况:
- 开始在整个屏幕上调整大小,提供沉浸式体验。
- Microsoft Store 应用的标题栏自动隐藏,以删除不必要的 chrome,并使内容产生穿透效果。
- Microsoft Store 应用和 Win32 应用在平板模式下可以优化其布局,以遵循触控优先的原则。
- 用户可以通过从顶部边缘向下轻扫来关闭应用,甚至包括 Win32 应用。
- 用户可以并排贴靠最多两个应用(包括 Win32 应用),并可用手指轻松地同时调整其大小。
- 应用可以一同自动启动以创建多任务布局,而无需用户付出太多的努力。
- 任务栏转换为更适合平板电脑的导航栏和状态栏。
- 可以自动调用触摸键盘。
当然,即使是在“平板模式”下,用户也可以享受贴靠助手、任务视图和操作中心等 Windows 10 功能。 在支持触控的设备上,客户可以触控友好的方式调用这些功能:可以从左边缘向内轻扫以打开任务视图,或者从右边缘向内轻扫以打开操作中心。
平板模式让客户能够以最舒适的方式灵活使用其设备。 例如,客户在将 8 英寸平板电脑对接到外部监视器、鼠标和键盘之前,可以仅在“平板模式”下使用该设备。 在对接外设之后,客户将退出“平板模式”,并在传统的桌面窗口中使用其所有应用 — 就像在以前版本的 Windows 中一样。 同样,二合一变形本设备的用户在整日使用设备的过程中(例如,在公交上通勤、在办公桌前办公时),可以根据硬件建议相应转换的信号进入和退出“平板模式”。
为设备设计平板模式
如果你正在设计二合一变形本或可分离电脑设备,我们建议在设计产品时遵循以下流程图。 这可以确保采取适当的实现方案,以便在设备状态更改时能够显示平板模式提示。 流程图中的每个方框包含一个实现选项。
方法 1 - 为基于 GPIO 的指示器实现 ACPI 描述
如果你的系统是使用物理 GPIO 指示状态转换的二合一设备,你可以在 ACPI 中描述状态转换指示器,而 Windows 会自动将该指示器触发的 GPIO 中断转发到操作系统。
有关详细信息,请查看 MSDN 上的以下资源。
- 指示器实现 (https://msdn.microsoft.com/library/windows/hardware/dn457884.aspx)
- ACPI 描述符示例 (https://msdn.microsoft.com/library/windows/hardware/dn457868.aspx)
方法 2 - 使用注入接口
如果你的系统是不使用物理 GPIO 指示状态转换的二合一设备,则必须开发一个可将状态转换指示注入 Microsoft 的“GPIO 笔记本电脑和平板电脑指示器驱动程序”的用户模式或内核模式驱动程序。
“GPIO 笔记本电脑和平板电脑指示器驱动程序”的注入接口定义如下:
/* 317fc439-3f77-41c8-b09e-08ad63272aa3 */ DEFINE_GUID(GUID_GPIOBUTTONS_LAPTOPSLATE_INTERFACE, 0x317fc439, 0x3f77, 0x41c8, 0xb0, 0x9e, 0x08, 0xad, 0x63, 0x27, 0x2a, 0xa3);
对接口调用 WriteFile 可以切换指示器的状态。 可在以下 MSDN 网页上找到演示驱动程序如何使用注入接口的代码示例:https://msdn.microsoft.com/library/windows/hardware/dn457889.aspx
如果你正在创建使用注入接口的驱动程序,仍然需要为笔记本电脑/平板电脑模式指示器声明 ACPI 描述,以确保加载 Microsoft 的“GPIO 笔记本电脑和平板电脑指示器驱动程序”。 但是,不需要将 GPIO 资源添加到“笔记本电脑和平板电脑指示器”的 ACPI 声明中。
注意:当设备启动时,“GPIO 笔记本电脑和平板电脑指示器驱动程序”首先在“平板电脑”模式下初始化。 因此,注入驱动程序必须检查操作系统状态,以确保在设备启动后,操作系统状态立即与系统的实际状态同步,这一点非常重要。
SOC IHV 合作伙伴可能已提供某个驱动程序或其他解决方案用于将状态转换注入 Microsoft 自带的驱动程序。 如果是这样,你可以根据 IHV 的具体指导利用其解决方案来节省时间和精力。
方法 3 - 使用无人参与 (unattend) 设置来声明永久设备状态
如果你的设备不是二合一设备(例如,是普通的笔记本电脑或台式机),你可以在应答文件中使用 ConvertibleSlateModePromptPreference 设置来禁用提示。 将值设置为 0,这样,提示就不会显示,而 UI 也不会切换。 如果未指定值,则默认值为 1,在这种情况下,系统会提示切换模式。
注意:还建议在应答文件中使用 DeviceForm 设置来指定你要设计的外形规格类型。
测试设备
验证设备是否实现 ConvertibleSlateMode
如果你不确定设备是否正确实现 ConvertibleSlateMode,请检查设备管理器中是否存在“GPIO 笔记本电脑或平板电脑指示器驱动程序”。
确保在设备管理器中启用“显示隐藏的设备”以确认是否存在此驱动程序:
可通过两种主要方式进入/退出“平板模式”:
- 手动 - 用户可以通过按下操作中心内的“平板模式”按钮手动进入/退出“平板模式”。
- 触发的硬件操作 - 如果硬件指示外形规格已更改,则操作系统可以通过 ConvertibleSlateMode 询问用户是否进入/退出“平板模式”。
不支持使用蓝牙键盘作为平板模式触发器。 使用蓝牙作为触发器的主要问题在于,蓝牙事件与设备配对和接近相关联,并且这些事件无法可靠地指明键盘是否正在使用中(例如,键盘甚至可能不在客户附近),因此也就无法可靠指明客户想要进入或退出“平板模式”的意图。
如果你希望确保搭载蓝牙键盘的设备为客户提供基于硬件的提示来更改模式,我们建议实现一个能够了解当前外形规格,然后通过 ConvertibleSlateMode 向操作系统发送信号的传感器。
由于进入/退出“平板模式”的 Windows 提示依赖于 ConvertibleSlateMode 的实现,因此必须确保用于切换 ConvertibleSlateMode 的固件经过全面的测试。 低质量的 ConvertibleSlateMode 实现可能导致糟糕的最终用户体验,例如多次要求用户“进入‘平板模式’”。
此外,当二合一设备从翻盖式电脑转变为平板电脑时,键盘和触摸板可能会收到平板电脑用户的意外按键指令。 当变形本转变为平板电脑时,Windows 不支持忽略来自内置键盘和触摸板的输入。 我们希望设备制造商在其硬件或软件设计方面付出努力,以避免在外形规格发生更改期间收到意外输入,并对此进行全面测试。 下表显示了可能发生的几个常见错误,以及导致这些错误的用例。 应该对这些用例进行测试,以防止用户遇到糟糕的切换体验:
错误 | 可能导致错误的用例 |
---|---|
即使不存在客户可观察到的原因(例如误触发),ConvertibleSlateMode 也会切换。 |
|
ConvertibleSlateMode 认为系统当前采用平板电脑的外形规格,但实际上它是笔记本电脑的外形规格(或反之)。 |
|
ConvertibleSlateMode 快速连续切换多次,导致操作系统反复提示用户进入/退出“平板模式”。 |
|
无人参与设置
如果你正在设计支持平板模式的设备,以下无人参与设置会有帮助:
无人参与设置 | 说明 | 值 |
---|---|---|
使用 ConvertibleSlateMode 设置可以指定设备的物理能力,这会影响设备的物理行为(例如旋转和屏幕键盘);并且可以帮助定义呈现给最终用户的适当首次使用体验。 如果你指定笔记本电脑模式,则最终用户可以在物理键盘上键入。 如果你指定平板模式,则最终用户无法在物理键盘上键入,因为键盘已删除或已翻转,因此键盘不可访问。 |
|
|
使用 ConvertibleSlateModePromptPreference 设置,可以指定是要提示用户进入还是退出平板模式。 设备外形规格或产品设计将影响你是否选择显示提示。 如果选择隐藏提示,则不会切换模式。 (也就是说,如果平板模式已打开,则它会保持打开;如果平板模式已关闭,则它会保持关闭。)如果你希望在发生硬件事件时出现提示,需要实现某种硬件或软件解决方案来切换此设置。 |
|
|
可以使用 SignInMode 设置来指定在用户登录后,是要将显示器设置为平板模式还是桌面模式。 如果未显式设置此值,则在屏幕尺寸小于 10 英寸并且首选电源管理配置文件(电源平台角色)是平板电脑(即平板电脑外形规格)的情况下,默认值为平板模板。 否则,默认值是上次使用的设置。 如果以前未指定设置,则认为上次使用的设置是桌面模式。 |
|
|
指定 DeviceForm 设置,使各种应用(例如必应和小娜)都可以根据指定的设备外形规格确定正确的内容。 还可以将此设置用于零售演示模式等功能,以根据设备类型指定最合适的演示内容。 |
有 30 个可能的值。 下面列出了主要值:
|
“平板模式”的行为
为了在 Windows 中实现出色的平板体验,已针对平板模式优化了任务栏的以下桌面方面:
- 显示正在运行的应用 - 此行为建议用户管理其正在运行的应用的生命周期。
- 桌面的多个入口点 - 平板电脑用户在“平板模式”下不需要轻松访问桌面。
- 任务栏中的紧密布局 - 任务栏可以容纳更多项,但在“平板模式”下,触摸可能是主要输入,因此需要不太紧密的布局。
- 在顶层和溢出层显示桌面工具栏和 Win32 通知图标 - 其中的大多数图标不是用户有意放置的,并且不常用。
旋转锁定
旋转锁定默认设置为已启用(或已锁定)。 除非 OEM 将旋转锁定设置为已解锁,否则 OOBE 可能导致客户在拆开新平板的包装后感到沮丧,因为平板不会根据客户手握新设备的方式横向或纵向旋转。 如果禁用旋转锁定,OEM 可以确保客户对其新设备的响应能力感到惊喜,甚至在他们通过操作中心的“快速操作”区域尝试轻松管理旋转锁定设置之前,就能得到这种感觉。
若要将旋转锁定设置为已禁用并按默认启用旋转,请执行以下操作:
- 在审核模式下,将 HKLM\Software\Microsoft\Windows\CurrentVersion\AutoRotation\Enable 设置为 1,这表示启用旋转。
- 像往常一样使用 Sysprep 为客户准备计算机。
通知区域图标
进入平板模式时,通知区域会发生多种变化。 将显示以下图标:
- 电池
- 网络
- 数据量(Volume)
- 操作中心
更具体地说,如果用户将这四个图标中的任何一个降级为溢出,该图标将返回顶层;如果 OEM 已将电池图标降级为溢出,该图标将返回顶层。
但是,如果客户在“设置”中的“打开或关闭系统图标”(如下所示)下禁用了其中一个图标,则 Windows 将遵循客户的手动设置,而不启用该图标。
OEM 固定的通知图标将会隐藏,用户固定的通知图标将会隐藏,溢出尖角图标将会隐藏,因而实际上会隐藏溢出窗口。
将阻止通知图标自动提升到顶层,但应用应该仍可以触发 toast 通知,即使图标无法放到顶层。 一种例外情况是定位服务图标。 如果在“打开或关闭系统图标”下启用该图标,它可以将自身提升到顶层并显示在电池图标的左侧。 但是,如果用户使用“打开或关闭系统图标”设置手动选择禁用定位服务图标,Windows 不会强制提升该图标。
如果客户选择“始终在通知区域中显示所有图标”设置,则上述行为将会关闭,并且通知区域将还原为未使用平板模式时的内容和行为。
“触摸键盘”按钮
进入平板模式时,“触摸键盘”按钮将会隐藏。 可以通过平板模式任务栏上下文菜单中的“显示触摸键盘按钮”设置来控制其可见性。
应用图标
在平板模式下,默认会在任务栏上隐藏应用图标。 此行为由“处于平板模式时在任务栏上隐藏应用图标”设置控制:
创建与平板模式 API 交互的应用
可以通过在应用中使用通用 Windows 平台 (UWP) 和经典 Windows API 来利用平板模式。 使用这些 API 可以定制应用的用户体验,使其在平板模式下遵循触控优先的原则,在使用桌面时遵循鼠标优先的原则。 本部分介绍如何在应用程序中使用 UWP 和经典 Windows API 来检测平板模式并对其做出反应。
这些 API 允许 Windows 桌面应用程序和通用 Windows 应用查询当前交互模式并响应对该模式所做的更改,如下所述。
经典 Windows 应用 API
UIViewSettings | 允许应用查询特定应用程序的系统当前指针设备首选项状态。 它是从 GetForCurrentView 获取的不可激活类。 |
UserInteractionMode | GetForWindow 的属性,采用 Windows.UI.ViewManagement.UserInteractionMode 枚举中的某个值,允许的值为 Touch 和 Mouse。 |
WM_SETTINGSCHANGE | 当前输入状态更改时,将通过“UserInteractionMode”广播 WM_SETTINGSCHANGE,以此通知应用。 |
通用 Windows 应用 API
UIViewSettings | 允许应用查询特定应用程序的系统当前指针设备首选项状态。 它是从 GetForCurrentView 获取的不可激活类。 |
UserInteractionMode | UIViewSettings 的属性,采用 Windows.UI.ViewManagement.UserInteractionMode 枚举中的某个值,允许的值为 Touch 和 Mouse。 |
SizeChanged | 当前输入状态更改时将触发事件。 应用应查询此事件。 |
示例 1:优化应用启动时的布局
当应用启动时,它可以查询系统的当前状态,并根据当前交互模式优化其布局,如以下示例所示。
通用 Windows 应用 (C#) 示例
using Windows.UI.Xaml;
using Windows.UI.ViewManagement;
public sealed partial class MainPage : Page
{
public MainPage()
{
InitializeComponent();
// Every view gets an initial SizeChanged, so we will do all our
// work there. This means that our view also responds to dynamic
// changes in user interaction mode.
Window.Current.SizeChanged += SizeChanged;
}
private void SizeChanged(object sender, RoutedEventArgs e)
{
switch(UIViewSettings.GetForCurrentView().UserInteractionMode)
{
case UserInteractionMode.Mouse:
VisualStateManager.GoToState(this, "MouseLayout", true);
break;
case UserInteractionMode.Touch:
default:
VisualStateManager.GoToState(this, "TouchLayout", true);
break;
}
}
}
经典 Windows 应用 (C++) 示例
using namespace Microsoft::WRL::Wrappers;
using namespace Microsoft::WRL;
HRESULT OnLayout()
{
ComPtr<IUIViewSettingsInterop> uiViewSettingsInterop;
HRESULT hr = GetActivationFactory(
HStringReference(RuntimeClass_Windows_UI_ViewManagement_UIViewSettings).Get(),
&uiViewSettingsInterop);
if (SUCCEEDED(hr))
{
ComPtr<IUIViewSettings> uiViewSettings;
hr = uiViewSettingsInterop->GetForWindow(hwndApp, IID_PPV_ARGS(&uiViewSettings));
if (SUCCEEDED(hr))
{
Windows::UI::ViewManagement::UserInteractionMode mode;
hr = uiViewSettings->get_UserInteractionMode(&mode);
if (SUCCEEDED(hr))
{
switch (mode)
{
case UserInteractionMode_Mouse:
hr = LayoutForMouse();
break;
case UserInteractionMode_Touch:
default:
hr = LayoutForTouch();
break;
}
}
}
}
return hr;
}
示例 2:对进入/退出平板模式做出反应
当设备进入或退出平板模式时,shell 会提示用户切换模式。 可将此用作触发器,以根据当前交互模式优化应用。 必须查询系统的当前状态,如以下示例所示。
通用 Windows 应用 (C#) 示例
与示例 1 相同。
经典 Windows 应用 (C++) 示例
// WM_SETTINGCHANGE handler
void OnSettingsChange(LPARAM lParam)
{
if (lParam != 0)
{
PCWSTR message = reinterpret_cast<PCWSTR>(lParam);
if (CSTR_EQUAL == CompareStringOrdinal(message, -1, L“UserInteractionMode”, -1, TRUE))
{
OnLayout();
}
}
}
常见问题 (FAQ)
# | 问题 | 答案 |
---|---|---|
1 | 当设备处于“平板模式”时,是否有任何文件关联发生更改? | 否,Windows 不会更改任何文件关联,因为“平板模式”支持所有应用。 |
2 | 插入外部 USB 键盘时,是否会自动提示进入/退出“平板模式”? | 否,自动提示将通过切换 ConvertibleSlateMode 值来触发,而不是根据是否存在任何类型的键盘来触发。 |
3 | 哪种因素会触发在设备管理器中显示“GPIO 笔记本电脑或平板电脑指示器驱动程序”? | 定义 PNP0C60(笔记本电脑/平板电脑模式状态指示器)会触发在设备管理器中显示该驱动程序。 必须在设备管理器中选择“显示隐藏的设备”选项才能显示此驱动程序。 |
4 | 是否可以使用带有外部键盘和鼠标的纯一体机 (AiO) 来实现相同的方案? | 是的,AiO 可以通过在硬件的适当转换点实现 ConvertibleSlateMode 切换来利用“平板模式”。 |
5 | 禁用“平板模式”时是否会自动禁用触摸键盘? | 触摸键盘仅在“平板模式”下自动调用。 在使用桌面期间,必须手动调用触摸键盘。 如果用户不处于“平板模式”,但他们从设备中删除了键盘,则会出现触摸键盘。 |
6 | 蓝牙键盘是否被视为“扩充设备”? | 否,蓝牙键盘不被视为“扩充设备”,因为它们不一定总是扩充设备。 平板模式永远不会使用键盘(USB、蓝牙键盘等)的存在性来触发提示。 可以通过在适当的时间切换 ConvertibleSlateMode 来实现蓝牙可分离设备设计。 |
7 | Win32 应用:要使某个 Win32 应用利用平板模式,是否需要使用通用 Windows 平台 (UWP) API 编译该应用? | Win32 应用有一个特定于 Win32 的 API,它们可以使用该 API 在触控优先与鼠标优先的使用原则之间进行适配。 |
8 | 对于应用程序开发人员,我们是否需要调用任何 API 来处理平板和桌面模式的切换? 或者说,Windows 是否自动处理这种切换? | 若要更改应用程序内部的布局,需要使用 UWP API 或 Win32 API 来指明“平板模式”。 进入/退出“平板模式”时,系统会自动处理应用程序的实际大小调整。 |
9 | 我的系统实现 ConvertibleSlateMode,但状态转换不会导致系统提示我进入/退出“平板模式”。 | 如果你的二合一设备可正确切换 ConvertibleSlateMode,但系统不提示你进入/退出“平板模式”,则原因可能是该功能已关闭。 若要打开平板模式,请转到“设置”\“系统”\“平板模式”。 从下拉列表中,选择“当我的设备想要切换模式时”并选择“始终提示我确认。” |
10 | 对于平板电脑,如果支持 GPIO,我们是否需要虚拟驱动程序? 如果 GPIO 可用,我们是否需要进行任何 BIOS 更改? | 可以选择使用物理 GPIO 或注入驱动程序方法。 只要正确切换 ConvertibleSlateMode,就无需进行任何更改。 重要说明:Windows 10 的 ConvertibleSlateMode 实现与 Windows 8.1 不同。 必须全面测试设备以确保行为正确。 |
11 | 是否需要满足某些要求或对 UEFI BIOS 进行更改才能支持平板模式? | 支持平板模式不需要对 UEFI BIOS 进行固有的更改。 可以按照最适合你的任何方式随意切换 ConvertibleSlateMode。 |
12 | 屏幕旋转是否与平板模式相关联? | 否,屏幕旋转不一定与平板模式相关。 屏幕旋转与当前的设备配置相关联,而此配置不一定说明了设备是否处于“平板模式”。 |
13 | 将任务栏定位在左侧时会发生什么情况? | 任务栏将保留在它上次所在的位置。 |
14 | 你们是否计划实现这样一种方案:系统会根据其报告的笔记本电脑或平板电脑模式自动启用或禁用平板模式,而不向最终客户显示任何确认消息? | 不支持。 我们始终希望由用户控制和选择是否要切换模式。 用户可以根据他们的意愿替代此设置。 |
15 | 提示“进入平板模式”的 UI 是否会有变化? 你们是否计划添加一个复选框,让用户决定是否“每次都执行此操作”? | 是的,我们将改变此 UI 的当前设计。 其中将会包含一个“是/否”按钮和一个下拉列表,让用户选择下次要做什么(例如“始终提示”等)。 |
16 | 在平板模式下是否可以显示全局后退按钮的位置? | 该按钮位于“开始”按钮旁边。 |