原文:UWP: 實現 UWP 應用自啓動html
在上一篇文章中,咱們實現了使用命令行來啓動 UWP 應用,在這一篇文章中,咱們會實現 UWP 應用自啓用的實現,也即開機後或用戶登錄後,應用本身啓動。這些特性原來都是 Win32 程序所具有的,UWP 可以支持這些特性使得它和 Win32 程序的行爲進一步相同。 編程
與實現命令行啓動同樣,實現自啓動也大致上分爲兩步:首先,在 Package.appxmanifest 中添加 windows.startupTask 擴展(Extension);而後,在 App 類中處理 OnActivated 事件。事實上,除了這兩步外,咱們還須要增長檢查 StartupTask 的狀態並容許用戶控制自啓動的邏輯。windows
右擊項目中的 Package.appxmanifest 文件,在快捷菜單中選擇「打開方式「->」XML 文本編輯器「。打開後,對它的內容按如下修改:app
<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" xmlns:uap5="http://schemas.microsoft.com/appx/manifest/uap/windows10/5" IgnorableNamespaces="uap mp uap5"> ... <Applications> <Application ... <Extensions> <uap5:Extension Category="windows.startupTask" EntryPoint="AppAutoRun.App" Executable="AppAutoRun.exe"> <uap5:StartupTask DisplayName="AppAutoRun" Enabled="true" TaskId="AppAutoRun"/> </uap5:Extension> </Extensions> </Application> </Applications> </Package>
上述加粗的部分就是添加的擴展 windows.startupTask,其 EntryPoint 和 Executable 屬性分別指明 App 類的完整名稱以及當前應用的 exe 名稱。async
在 Extension 節點中,添加了一個節點 StartupTask,它有三個屬性,說明以下:編輯器
須要說明的是,Enabled 屬性應該設置爲 false;事實上這個屬性會被忽略;由於 UWP 要實現自啓動,至少須要啓動一次,而且向用戶請求贊成才行。另外目前只能添加一個 StartupTask 節點。ide
此時,能夠將應用部署(Deploy)到本機上,而後,在「任務管理器」中「啓動」選項卡上,咱們就能夠看到了。ui
這裏,右擊每一個任務,能夠對它的狀態進行控制(啓用/禁用),能夠看到當前應用的狀態是「已禁用」。注意,在設置它的狀態以前,App 須要至少被啓動過一次。不然這裏的設置是不起做用的。this
除了在 Package.appxmanifest 中增長擴展外,咱們還須要使用相關的 API 來查看所添加的 StartupTask 的狀態,以及對它的更改。在 MainPage.xaml 中增長如下代碼:spa
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Grid Margin="12"> <StackPanel> <TextBlock x:Name="tbState" /> <Button x:Name="btnSetState" Margin="0,4,0,0" Click="btnSetState_Click" /> </StackPanel> </Grid> </Grid>
在 MainPage.xaml.cs 中增長如下代碼:
private async void MainPage_Loaded(object sender, RoutedEventArgs e) { await LoadState(); } public async Task LoadState() { var task = await StartupTask.GetAsync("AppAutoRun"); this.tbState.Text = $"Status: {task.State}"; switch (task.State) { case StartupTaskState.Disabled: // 禁用狀態 this.btnSetState.Content = "啓用"; this.btnSetState.IsEnabled = true; break; case StartupTaskState.DisabledByPolicy: // 由管理員或組策略禁用 this.btnSetState.Content = "被系統策略禁用"; this.btnSetState.IsEnabled = false; break; case StartupTaskState.DisabledByUser: // 由用戶手工禁用 this.btnSetState.Content = "被用戶禁用"; this.btnSetState.IsEnabled = false; break; case StartupTaskState.Enabled: // 當前狀態爲已啓用 this.btnSetState.Content = "已啓用"; this.btnSetState.IsEnabled = false; break; } } private async void btnSetState_Click(object sender, RoutedEventArgs e) { var task = await StartupTask.GetAsync("AppAutoRun"); if (task.State == StartupTaskState.Disabled) { await task.RequestEnableAsync(); } // 從新加載狀態 await LoadState(); }
咱們經過 StartupTask 類(位於 Windows.ApplicationModel 命名空間下)的 GetAsync 來獲取指定 TaskId 的自啓動任務(StartupTask)。StartupTask 類具備一個 State 的枚舉屬性,用於表示其狀態。它們的值及其意義,在註釋中已經說明。
補充說明如下幾點:
經過 StartupTask 類的 RequestEnableAsync 方法,能夠向用戶請求將其啓動,調用這個方法後,會彈出以下窗口:
當用戶選擇「啓用」後,下次系統啓動後它就會自動啓動,反之,若是選擇」禁用「,那麼它的狀態會是 DisabledByUser。要想啓用它,就須要打開」任務管理器「,在」啓動「選項卡上右擊它,選擇「啓用」。
而後,在 App 類的 OnActivated 事件上增長對 ActivationKind 類的判斷,並做相應的處理便可。代碼以下:
protected override void OnActivated(IActivatedEventArgs args) { Frame rootFrame = Window.Current.Content as Frame; if (rootFrame == null) { rootFrame = new Frame(); Window.Current.Content = rootFrame; } var protoclForResultsArgs = (ProtocolActivatedEventArgs)args; rootFrame.Navigate(typeof(MainPage), protoclForResultsArgs); Window.Current.Activate(); }
protected override void OnActivated(IActivatedEventArgs args) { Frame rootFrame = Window.Current.Content as Frame; if (rootFrame == null) { rootFrame = new Frame(); Window.Current.Content = rootFrame; } if (args.Kind == ActivationKind.StartupTask) { var startupArgs = args as StartupTaskActivatedEventArgs; } rootFrame.Navigate(typeof(MainPage), args.Kind); Window.Current.Activate(); }
最後,要注意的是:若是啓用了自啓動,當系統啓動後,應用會以最小化的方式啓動。
參考資料: