共用方式為


適用於指派存取權的 Kiosk 應用程式:最佳做法

在 Windows 10 中,您可以使用指派的存取權來建立 kiosk 裝置,讓使用者只與單一通用 Windows 應用程式互動。 本文說明如何實作 kiosk 應用程式,以及最佳做法。

指派的存取權提供兩種不同的體驗:

  1. 單一應用程式 kiosk 體驗

    將一個應用程式指派給帳戶。 當使用者登入時,他們只能存取此應用程式,而且系統上沒有其他許可權。 在此期間,kiosk 裝置已鎖定,kiosk 應用程式會在鎖定畫面上方執行。 此體驗通常用於面向公眾的 Kiosk 計算機。 如需詳細資訊,請參閱在 Windows 10 專業版、企業或教育版上設定 kiosk。

  2. 多應用程式 Kiosk 體驗(適用於 Windows 10 版本 1709 和更新版本)

    您可以將一或多個應用程式指派給帳戶。 當使用者登入時,裝置會在限制的殼層體驗中啟動,只存取您選取的應用程式。 如需詳細資訊,請參閱 建立執行多個應用程式的 Windows 10 kiosk。

本文僅說明單一應用程式 kiosk 體驗。 在多應用程式體驗中,選取的應用程式會在一般桌面內容中執行,而且不需要特殊處理或修改。

詞彙

詞彙 描述
指派的存取權 一項功能,可讓系統管理員藉由限制向裝置使用者公開的應用程式進入點來管理用戶體驗。 例如,您可以限制您企業的客戶使用一個應用程式,讓您的電腦就像 kiosk 一樣運作。 每當有人使用指定的帳戶登入時,他們就只能使用該一個應用程式。 他們無法使用觸控手勢、滑鼠、鍵盤或硬體按鈕來切換應用程式或關閉應用程式。 它們也不會看到任何應用程式通知。
鎖定畫面應用程式 (或鎖定應用程式 ) 利用動態桌布或利用新鎖定擴充性架構的功能的應用程式。
鎖定畫面應用程式上方 (或高於鎖定應用程式) 鎖定畫面應用程式正在執行時啟動於鎖定畫面上方的應用程式(例如,鎖定桌面時)。
鎖定應用程式底下 在已解除鎖定的 Windows 內容中正常執行的應用程式。
LockApplicationHost WinRT 類別,可讓上述鎖定畫面應用程式要求裝置解除鎖定,並允許應用程式註冊在裝置開始解除鎖定時收到通知。
檢視或應用程式檢視 每個檢視都是應用程式中的個別視窗。 應用程式可以有主要檢視,並視需要建立多個和次要檢視。 如需詳細資訊,請參閱 ApplicationView

windows.aboveLockScreen 擴充功能

Windows 10 中指派的存取權會使用鎖定架構。 當指派的存取權使用者登入時,背景工作會鎖定桌面,並在鎖定上方啟動 kiosk 應用程式。 應用程式的行為可能會有所不同,視它是否使用 windows.aboveLockScreen 擴充功能而定。

使用 windows.aboveLockScreen 可讓您的 kiosk 應用程式存取 LockApplicationHost 運行時間類別,讓應用程式知道其何時在鎖定上方執行(因此以 kiosk 體驗執行)。 如果無法傳回實例,應用程式就會在一般桌面內容中執行。

當鎖定架構在鎖定上方啟動 kiosk 應用程式,且應用程式具有 windows.aboveLockScreen 擴充功能時,鎖定架構會自動在鎖定上方建立新的次要檢視。 主要檢視位於鎖定底下。 此次要檢視包含您的應用程式內容,以及使用者看到的內容。 此額外檢視可搭配擴充功能使用,以量身打造您的 Kiosk 體驗。 例如,您可以:

如果應用程式沒有 windows.aboveLockScreen 擴充功能,則不會建立任何次要檢視,而且應用程式會啟動,就像它正常執行一樣。 此外,由於應用程式無法存取 LockApplicationHost 的實例,因此無法判斷它是否在一般內容中執行,或是在 Kiosk 體驗中執行。 不包括延伸模組有優點,例如能夠支援 多個監視器

無論您的應用程式是否使用延伸模組,請務必保護其數據。 如需詳細資訊,請參閱指派存取應用程式的指導方針。

從 Windows 10 版本 1607 開始,通用 Windows 平台 (UWP) 擴充功能已不再有限制,因此當使用者設定受指派的存取權時,大部分的應用程式都可以顯示在 設定

最佳作法

本節適用於使用 windows.aboveLockScreen 擴充功能的 Kiosk 應用程式。

保護您的資訊

如果 kiosk 應用程式是要在指派的存取權和解除鎖定的 Windows 內容中同時執行上述鎖定,您可能想要建立不同的頁面來轉譯上述鎖定,並在鎖定下建立另一個頁面。 這可讓您避免在 kiosk 模式中顯示敏感性資訊,因為 kiosk 模式通常表示匿名存取。 以下是您使用兩個不同的頁面的步驟,一個用於鎖定底下,另一個用於鎖定上方:

  1. 在 App.xaml.cs OnLaunched 函式的覆寫中,嘗試在 rootFrame 流覽之前取得 LockApplicationHost 類別的實例。

  2. 如果呼叫失敗,kiosk 應用程式應該會在鎖定下正常啟動。

  3. 如果呼叫成功,kiosk 應用程式應該會在指派存取模式中執行的鎖定上方啟動。 您可能想要此版本的 kiosk 應用程式有不同的主頁面來隱藏敏感性資訊。

下列範例示範如何執行這項操作。 AssignedAccessPage.xaml 已預先定義,一旦應用程式偵測到在鎖定模式上執行,應用程式就會巡覽至 AssignedAccessPage.xaml。 因此,一般頁面只會顯示在鎖定案例下。

您可以使用此方法來判斷應用程式是否在應用程式生命週期中隨時在鎖定畫面上執行,並據此做出反應。

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);
    }
}

多個檢視、視窗和線程

從 Windows 10 版本 1803 開始,沒有 windows.aboveLockScreen 擴充功能的應用程式,Kiosk 體驗支援多個檢視。 若要使用多個檢視,請確定 kiosk 裝置的 [多重顯示 ] 選項已設定為 [ 擴充這些顯示器]。

在 Kiosk 體驗期間啟動具有多個檢視的應用程式(且不含 windows.aboveLockScreen),應用程式的主要檢視將會在第一部監視器上轉譯。 如果應用程式使用 CreateNewView()建立新的檢視,則會在第二個監視器上轉譯。 如果應用程式建立另一個檢視,則會移至第三個監視器等等。

重要

Kiosk 裝置每個監視器只能顯示一個檢視。 例如,如果 kiosk 裝置只有一部監視器,它一律會顯示 kiosk 應用程式的主要檢視。 不會顯示應用程式所建立的新檢視。

當 kiosk 應用程式具有 windows.aboveLockScreen 擴充功能且在鎖定上方執行時,會以不同的方式初始化。 其主要檢視位於鎖定下,其上方有次要檢視。 這個次要檢視是使用者看到的內容。 即使您未明確建立任何新檢視,您仍會在應用程式實例中擁有兩個檢視。

當應用程式以鎖定模式執行時,檢視的 z 順序。

您可以在應用程式的主要視窗中執行下列程式代碼(在指派的存取模式中),以查看檢視計數,以及目前畫面是否為主要檢視。

using Windows.ApplicationModel.Core;

CoreApplication.GetCurrentView().IsMain //false
CoreApplication.Views.Count //2

調度員

每個檢視或視窗都有自己的發送器。 因為主要檢視對用戶隱藏,請使用 GetCurrentView() 來存取在鎖定上方執行的應用程式次要檢視,而不是 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;
        });
}

當應用程式具有 windows.aboveLockScreen 並以 kiosk 體驗執行時,建立新的檢視會導致應用程式內的例外狀況:

Windows.ApplicationModel.Core.CoreApplication.CreateNewView(); //causes exception

因此,您無法在多個監視器上有多個檢視或執行。 如果您的應用程式需要支援其中一項,您必須從您的應用程式中移除 windows.aboveLockScreen 擴充功能。

新增指派存取權的出路

在某些情況下,可能無法在鍵盤上啟用或提供用來停止應用程式的電源按鈕、逸出按鈕或其他按鈕。 在這些情況下,請提供方法來停止指派的存取權,例如軟體密鑰。 下列事件處理程式示範如何藉由回應可由軟體密鑰觸發的按鈕選取事件來停止指派的存取模式。

LockApplicationHost^ lockHost = LockApplicationHost::GetForCurrentView();
    if (lockHost != nullptr)
    {
        lockHost->RequestUnlock();
    }

生命週期管理

Kiosk 應用程式的生命週期是由指派的存取架構處理。 如果應用程式意外結束,架構會嘗試重新啟動它。 不過,如果使用者按下 Ctrl+Alt+Del 來顯示登入畫面,則會觸發解除鎖定事件。 指派的存取架構會接聽事件,並嘗試終止應用程式。

您的 kiosk 應用程式也可以註冊此事件的處理程式,並在結束之前執行動作。 儲存任何數據就是此範例。 如需註冊處理程式的範例,請參閱下列程序代碼。

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();
}

使用者按下 Ctrl+Alt+Del 並顯示登入畫面之後,可能會發生兩件事:

  1. 使用者知道指派的存取帳戶密碼,並解除鎖定桌面。 指派的存取架構會啟動、鎖定桌面,以及鎖定畫面應用程式啟動,進而啟動 kiosk 應用程式。

  2. 使用者不知道密碼或未採取任何進一步動作。 登入畫面逾時,桌面重新鎖定;鎖定畫面應用程式隨即啟動,進而啟動 kiosk 應用程式。

請勿在指派的存取模式中建立新的視窗或檢視

如果以指派的存取模式叫用下列函式呼叫,則最後會有運行時間例外狀況。 如果相同的應用程式在鎖定下使用時呼叫 函式,則不會造成運行時間例外狀況。 使用 LockApplicationHost 來判斷應用程式的指派存取模式,並據以撰寫應用程式的程式代碼,例如,如果應用程式處於指派的存取模式,則不要建立新的檢視。

Windows.ApplicationModel.Core.CoreApplication.CreateNewView(); //causes exception

附錄 1:UWP 擴充功能

下列範例應用程式指令清單使用 windows.aboveLockScreenUWP 擴充功能。

從 Windows 10 版本 1607 開始,通用 Windows 平台 (UWP) 擴充功能不再有限制,因此當使用者設定受指派的存取權時,大部分的應用程式都可以顯示在 設定 中。

<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>

附錄 2:疑難解答

一般而言,如果 Kiosk 應用程式無法在鎖定畫面應用程式上方啟用,您可以在鎖定畫面中找到啟用錯誤碼。 透過查閱 Windows 系統錯誤碼,使用錯誤碼來探索問題。 此外,事件檢視器 也包含有關啟用失敗的詳細資訊。 若要這麼做︰

  1. 開啟 [事件檢視器]。 有兩個可能的地方可以尋找啟用錯誤。

  2. 在 [事件檢視器 [本機] 窗格中,展開 [Windows 記錄],然後選取 [應用程式]。

  3. 此外,在 事件檢視器 (local)中,依序展開 [應用程式和服務記錄]、[Windows]、[應用程式] 和 [應用程式],然後選取 [Microsoft-Windows-TWinUI/Operational]。

由於具有指派存取權的 kiosk 應用程式不會以全螢幕模式執行, ApplicationView.GetForCurrentView()。IsFullScreenMode 會傳回 false。

指派的存取權

顯示應用程式的多重檢視