Aplicaciones de pantalla completa para el acceso asignado: Procedimientos recomendados
En Windows 10, puedes usar el acceso asignado para crear un dispositivo de pantalla completa, lo que permite a los usuarios interactuar con una sola aplicación universal de Windows. En este artículo se describe cómo implementar una aplicación de pantalla completa y procedimientos recomendados.
Hay dos experiencias diferentes que proporciona el acceso asignado:
La experiencia de pantalla completa de una sola aplicación
Asigne una aplicación a una cuenta. Cuando un usuario inicia sesión, solo tendrá acceso a esta aplicación y nada más en el sistema. Durante este tiempo, el dispositivo de pantalla completa está bloqueado, con la aplicación de pantalla completa que se ejecuta encima de la pantalla de bloqueo. Esta experiencia se usa a menudo para las máquinas de pantalla completa orientadas al público. consulta Configurar un quiosco multimedia en Windows 10 Pro, Enterprise o Education para obtener más información.
La experiencia de pantalla completa de varias aplicaciones (disponible en Windows 10, versión 1709 y posteriores)
Puede asignar una o varias aplicaciones a una cuenta. Cuando un usuario inicia sesión, el dispositivo se inicia en una experiencia de shell restringida con acceso solo a las aplicaciones seleccionadas. Consulta Crear un quiosco de Windows 10 que ejecute varias aplicaciones para obtener más información.
En este artículo se describe solo la experiencia de pantalla completa de una sola aplicación. En la experiencia de varias aplicaciones, las aplicaciones seleccionadas se ejecutan en un contexto de escritorio normal y no requieren ningún control ni modificación especiales.
Términos
Término | Descripción |
---|---|
acceso asignado | Característica que permite a un administrador del sistema administrar la experiencia del usuario limitando los puntos de entrada de aplicación expuestos al usuario del dispositivo. Por ejemplo, puedes restringir a los clientes de tu empresa a usar una aplicación para que tu PC actúe como un quiosco. Siempre que alguien inicie sesión con la cuenta especificada, solo podrá usar esa aplicación. No podrán cambiar de aplicación ni cerrar la aplicación mediante gestos táctiles, un mouse, el teclado o los botones de hardware. Tampoco verán ninguna notificación de aplicación. |
aplicación de pantalla de bloqueo (o aplicación de bloqueo) | Una aplicación que aprovecha la capacidad de establecer un fondo de pantalla dinámico o que aprovecha el nuevo marco de extensibilidad de bloqueos. |
aplicación de pantalla de bloqueo anterior (o aplicación de bloqueo superior) | Una aplicación que se inicia encima de la pantalla de bloqueo mientras se ejecuta la aplicación de pantalla de bloqueo (por ejemplo, cuando el escritorio está bloqueado). |
en la aplicación de bloqueo | Una aplicación que se ejecuta normalmente, en un contexto de Windows desbloqueado. |
LockApplicationHost | Una clase WinRT que permite a las aplicaciones de pantalla de bloqueo anteriores solicitar que el dispositivo se desbloquee y permite que la aplicación se registre cuando el dispositivo empiece a desbloquearse. |
Vista o vista de aplicación | Cada vista es una ventana independiente en la aplicación. Una aplicación puede tener una vista principal y crear varias vistas secundarias a petición. Consulte ApplicationView para obtener más información. |
La extensión windows.aboveLockScreen
El acceso asignado en Windows 10 usa el marco de bloqueo. Cuando un usuario de acceso asignado inicia sesión, una tarea en segundo plano bloquea el escritorio e inicia la aplicación de pantalla completa encima del bloqueo. El comportamiento de la aplicación puede diferir, en función de si usa la extensión windows.aboveLockScreen.
El uso de windows.aboveLockScreen permite que la aplicación de pantalla completa acceda a la clase en tiempo de ejecución LockApplicationHost , lo que permite a la aplicación saber cuándo se ejecuta por encima del bloqueo (y, por tanto, ejecutarse como una experiencia de pantalla completa). Si no se puede devolver una instancia, la aplicación se ejecuta en un contexto de escritorio normal.
Cuando el marco de bloqueo inicia la aplicación de pantalla completa encima del bloqueo y la aplicación tiene la extensión windows.aboveLockScreen , el marco de bloqueo crea automáticamente una nueva vista secundaria encima del bloqueo. La vista principal se encuentra bajo el bloqueo. Esta vista secundaria contiene el contenido de la aplicación y es lo que ve el usuario. Esta vista adicional se puede usar con la extensión para adaptar la experiencia de pantalla completa. Por ejemplo, puede hacer lo siguiente:
Proteja la experiencia de pantalla completa mediante la creación de una página independiente para mostrar contenido de solo pantalla completa.
Llame al método LockApplicationHost.RequestUnlock() desde la aplicación para salir del modo de acceso asignado y volver a la pantalla de inicio de sesión.
Agregue un controlador de eventos al evento *LockApplicationHost.Unlocking que se desencadena cuando un usuario presiona Ctrl+Alt+Supr para salir de la experiencia de pantalla completa. El controlador también se puede usar para guardar los datos antes de salir.
Si la aplicación no tiene la extensión windows.aboveLockScreen , no se crea ninguna vista secundaria y la aplicación se inicia como si estuviera ejecutándose normalmente. Además, dado que la aplicación no tendrá acceso a una instancia de LockApplicationHost, no podrá determinar si se ejecuta en un contexto normal o para una experiencia de pantalla completa. No incluir la extensión tiene ventajas, como poder admitir varios monitores.
Independientemente de si la aplicación usa la extensión, asegúrese de proteger sus datos. Consulte las instrucciones para aplicaciones de acceso asignadas para obtener más información.
A partir de Windows 10, versión 1607, ya no hay ninguna restricción en la extensión Plataforma universal de Windows (UWP), por lo que la mayoría de las aplicaciones se pueden mostrar en Configuración cuando el usuario configura el acceso asignado.
procedimientos recomendados
Esta sección se aplica a una aplicación kiosk que usa la extensión windows.aboveLockScreen .
Protección de la información
Si la aplicación de pantalla completa está pensada para ejecutar el bloqueo anterior en el acceso asignado y también en el contexto de Windows desbloqueado, puede que desee crear una página diferente para representar el bloqueo anterior y otra página para bajo el bloqueo. Esto le permite evitar mostrar información confidencial en modo de pantalla completa, ya que el modo de pantalla completa normalmente significa acceso anónimo. Estos son los pasos que seguiría para usar dos páginas diferentes, una para bajo el bloqueo y otra para encima del bloqueo:
Dentro de la invalidación de la función OnLaunched en App.xaml.cs, intente obtener una instancia de la clase LockApplicationHost antes de la navegación de rootFrame.
Si se produce un error en la llamada, la aplicación de pantalla completa debería iniciarse normalmente, bajo el bloqueo.
Si la llamada se realiza correctamente, la aplicación de pantalla completa debe iniciarse encima del bloqueo que se ejecuta en modo de acceso asignado. Es posible que quieras que esta versión de la aplicación de pantalla completa tenga otra página principal para ocultar información confidencial.
En el ejemplo siguiente se muestra cómo hacerlo. AssignedAccessPage.xaml está predefinido y la aplicación navega a AssignedAccessPage.xaml una vez que detecta que se ejecuta en modo de bloqueo anterior. Como resultado, la página normal solo se mostraría en el escenario de bloqueo bajo bloqueo.
Puede usar este método para determinar si la aplicación se ejecuta por encima de la pantalla de bloqueo en cualquier momento del ciclo de vida de la aplicación y reaccionar en consecuencia.
using Windows.ApplicationModel.LockScreen;
// inside the override OnLaunched function in App.xaml.cs
if (rootFrame.Content == null)
{
LockApplicationHost host = LockApplicationHost.GetForCurrentView();
if (host == null)
{
// if call to LockApplicationHost is null, this app is running under lock
// render MainPage normally
rootFrame.Navigate(typeof(MainPage), e.Arguments);
}
else
{
// If LockApplicationHost was successfully obtained
// this app is running as a lock screen app, or above lock screen app
// render a different page for assigned access use
// to avoid showing regular main page to keep secure information safe
rootFrame.Navigate(typeof(AssignedAccessPage), e.Arguments);
}
}
Varias vistas, ventanas y subprocesos
A partir de Windows 10, versión 1803, se admiten varias vistas en la experiencia de pantalla completa para las aplicaciones que no tienen la extensión windows.aboveLockScreen . Para usar varias vistas, asegúrese de que la opción Varias pantallas del dispositivo de pantalla completa está establecida en Extender estas pantallas.
Cuando se inicia una aplicación con varias vistas (y sin windows.aboveLockScreen) durante una experiencia de pantalla completa, la vista principal de la aplicación se representará en el primer monitor. Si la aplicación crea una nueva vista mediante CreateNewView(), se representa en el segundo monitor. Si la aplicación crea otra vista, irá al tercer monitor, etc.
Importante
Los dispositivos de pantalla completa solo pueden mostrar una vista por monitor. Por ejemplo, si el dispositivo de pantalla completa solo tiene un monitor, siempre mostrará la vista principal de la aplicación de pantalla completa. No se mostrarán nuevas vistas creadas por la aplicación.
Cuando una aplicación de pantalla completa tiene la extensión windows.aboveLockScreen y se ejecuta encima del bloqueo, se inicializa de forma diferente. Su vista principal se encuentra bajo el bloqueo, con una vista secundaria encima de ella. Esta vista secundaria es lo que ve el usuario. Aunque no cree explícitamente ninguna nueva vista, seguirá teniendo dos vistas en la instancia de la aplicación.
Puedes ejecutar el código siguiente en la ventana principal de la aplicación (en modo de acceso asignado) para ver el recuento de vistas y si la pantalla actual es la vista principal.
using Windows.ApplicationModel.Core;
CoreApplication.GetCurrentView().IsMain //false
CoreApplication.Views.Count //2
Distribuidor
Cada vista o ventana tiene su propio distribuidor. Dado que la vista principal está oculta al usuario, use GetCurrentView() para acceder a la vista secundaria de la aplicación que se ejecuta encima del bloqueo en lugar de MainView().
using Windows.ApplicationModel.Core;
private async void Button_Click(object sender, RoutedEventArgs e)
{
button.IsEnabled = false;
// start a background task and update UI periodically (every 1 second)
// using MainView dispatcher in below code will end up with app crash
// in assigned access mode, use GetCurrentView().Dispatcher instead
await CoreApplication.GetCurrentView().Dispatcher.RunAsync(
CoreDispatcherPriority.Normal,
async () =>
{
for (int i = 0; i < 60; ++i)
{
// do some background work, here we use Task.Delay to sleep
await Task.Delay(1000);
// update UI
textBlock1.Text = " " + i.ToString();
}
button.IsEnabled = true;
});
}
Cuando la aplicación tiene windows.aboveLockScreen y se ejecuta como una experiencia de pantalla completa, la creación de vistas nuevas provocará una excepción dentro de la aplicación:
Windows.ApplicationModel.Core.CoreApplication.CreateNewView(); //causes exception
Debido a esto, no puede tener varias vistas ni ejecutarse en varios monitores. Si la aplicación necesita admitir cualquiera de estas opciones, deberá quitar la extensión windows.aboveLockScreen de la aplicación.
Adición de una forma de salir del acceso asignado
En algunas situaciones, es posible que el botón de encendido, el botón de escape u otros botones usados para detener una aplicación no estén habilitados o disponibles en el teclado. En estas situaciones, proporcione una manera de detener el acceso asignado, por ejemplo, una clave de software. El siguiente controlador de eventos muestra cómo detener el modo de acceso asignado respondiendo al evento de selección de botón que podría desencadenar una clave de software.
LockApplicationHost^ lockHost = LockApplicationHost::GetForCurrentView();
if (lockHost != nullptr)
{
lockHost->RequestUnlock();
}
Administración del ciclo de vida
El marco de acceso asignado controla el ciclo de vida de una aplicación de pantalla completa. Si la aplicación finaliza inesperadamente, el marco intenta volver a iniciarla. Sin embargo, un usuario presiona Ctrl+Alt+Supr para abrir la pantalla de inicio de sesión, se desencadena un evento de desbloqueo. El marco de acceso asignado escucha el evento y intentará finalizar la aplicación.
La aplicación de pantalla completa también puede registrar un controlador para este evento y realizar acciones antes de salir. Guardar los datos es un ejemplo de esto. Consulte el código siguiente para obtener un ejemplo de registro de un controlador.
using Windows.ApplicationModel.LockScreen;
public AssignedAccessPage()
{
this.InitializeComponent();
LockApplicationHost lockHost = LockApplicationHost.GetForCurrentView();
if (lockHost != null)
{
lockHost.Unlocking += LockHost_Unlocking;
}
}
private void LockHost_Unlocking(LockApplicationHost sender, LockScreenUnlockingEventArgs args)
{
// save any unsaved work and gracefully exit the app
App.Current.Exit();
}
Una vez que el usuario presiona Ctrl+Alt+Supr y se muestra una pantalla de inicio de sesión, pueden ocurrir dos cosas:
El usuario conoce la contraseña de la cuenta de acceso asignada y desbloquea el escritorio. El marco de acceso asignado se inicia, bloquea el escritorio y la aplicación de pantalla de bloqueo se inicia, que a su vez inicia la aplicación de pantalla completa.
El usuario no conoce la contraseña o no realiza ninguna acción adicional. Los tiempos de espera de la pantalla de inicio de sesión y los rebloqueos del escritorio; se inicia la aplicación de pantalla de bloqueo que, a su vez, inicia la aplicación de pantalla completa.
No cree nuevas ventanas ni vistas en modo de acceso asignado
La siguiente llamada de función termina con una excepción en tiempo de ejecución si se invoca en modo de acceso asignado. Si la misma aplicación, cuando se usa bajo bloqueo, llama a la función , no produce una excepción en tiempo de ejecución. Resulta útil usar LockApplicationHost para determinar el modo de acceso asignado de la aplicación y codificar la aplicación en consecuencia, como no crear nuevas vistas si la aplicación está en modo de acceso asignado.
Windows.ApplicationModel.Core.CoreApplication.CreateNewView(); //causes exception
Apéndice 1: Extensión para UWP
El siguiente manifiesto de aplicación de ejemplo usa la extensión windows.aboveLockScreenpara UWP.
A partir de Windows 10, versión 1607, ya no hay ninguna restricción en la extensión Plataforma universal de Windows (UWP), por lo que la mayoría de las aplicaciones se pueden mostrar en Configuración cuando el usuario configura el acceso asignado.
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" IgnorableNamespaces="uap mp">
<Identity Name="bd4df68b-dc18-4748-a14e-bc21dac13736" Publisher="Contoso" Version="1.0.0.0" />
<mp:PhoneIdentity PhoneProductId="bd4df68b-dc18-4748-a14e-bc21dac13736" PhonePublisherId="00000000-0000-0000-0000-000000000000" />
<Properties>
<DisplayName>AboveLock</DisplayName>
<PublisherDisplayName>Contoso</PublisherDisplayName>
<Logo>Assets\StoreLogo.png</Logo>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
</Dependencies>
<Resources>
<Resource Language="x-generate" />
</Resources>
<Applications>
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="AboveLock.App">
<uap:VisualElements DisplayName="AboveLock" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png" Description="AboveLock" BackgroundColor="transparent">
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png">
</uap:DefaultTile>
<uap:SplashScreen Image="Assets\SplashScreen.png" />
</uap:VisualElements>
<Extensions>
<uap:Extension Category="windows.lockScreenCall" />
<uap:Extension Category="windows.aboveLockScreen" />
</Extensions>
</Application>
</Applications>
<Capabilities>
<Capability Name="internetClient" />
</Capabilities>
</Package>
Apéndice 2: Solución de problemas
Normalmente, si una aplicación de pantalla completa no se activa encima de la aplicación de pantalla de bloqueo, puede encontrar el código de error de activación en la pantalla de bloqueo. Use el código de error para detectar el problema mediante la búsqueda de códigos de error del sistema de Windows. Además, Visor de eventos contiene más información sobre los errores de activación. Para ello:
Abra Visor de eventos. Hay dos lugares probables para encontrar errores de activación.
En el panel Visor de eventos (local), expanda Registros de Windows y, a continuación, seleccione Aplicación.
Además, en Visor de eventos (local), expanda Registros de aplicaciones y servicios, expanda Windows, expanda Aplicacionesy, a continuación, seleccione Microsoft-Windows-TWinUI/Operational.
Dado que las aplicaciones de pantalla completa con acceso asignado no se ejecutan en modo de pantalla completa, ApplicationView.GetForCurrentView(). IsFullScreenMode devuelve false.