1 //********************************************************* 2 // 3 // Copyright (c) Microsoft. All rights reserved. 4 // THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF 5 // ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY 6 // IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR 7 // PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT. 8 // 9 //********************************************************* 10 11 // 12 // App.xaml.cpp 13 // Implementation of the App.xaml class. 14 // 15 16 #include "pch.h" 17 #include "MainPage.xaml.h" 18 #include "AdvancedCapture.xaml.h" 19 #include "Common\SuspensionManager.h" 20 21 using namespace SDKSample; 22 using namespace SDKSample::Common; 23 using namespace SDKSample::MediaCapture; 24 25 using namespace Concurrency; 26 using namespace Platform; 27 using namespace Windows::ApplicationModel; 28 using namespace Windows::ApplicationModel::Activation; 29 using namespace Windows::Foundation; 30 using namespace Windows::Foundation::Collections; 31 using namespace Windows::UI::Core; 32 using namespace Windows::UI::Xaml; 33 using namespace Windows::UI::Xaml::Controls; 34 using namespace Windows::UI::Xaml::Controls::Primitives; 35 using namespace Windows::UI::Xaml::Data; 36 using namespace Windows::UI::Xaml::Input; 37 using namespace Windows::UI::Xaml::Interop; 38 using namespace Windows::UI::Xaml::Media; 39 using namespace Windows::UI::Xaml::Navigation; 40 41 /// <summary> 42 /// Initializes the singleton application object. This is the first line of authored code 43 /// executed, and as such is the logical equivalent of main() or WinMain(). 44 /// </summary> 45 App::App() 46 { 47 InitializeComponent(); 48 this->Suspending += ref new SuspendingEventHandler(this, &SDKSample::App::OnSuspending); 49 } 50 51 /// <summary> 52 /// Invoked when the application is launched normally by the end user. Other entry points will 53 /// be used when the application is launched to open a specific file, to display search results, 54 /// and so forth. 55 /// </summary> 56 /// <param name="pArgs">Details about the launch request and process.</param> 57 void App::OnLaunched(LaunchActivatedEventArgs^ pArgs) 58 { 59 this->LaunchArgs = pArgs; 60 61 // Do not repeat app initialization when already running, just ensure that 62 // the window is active 63 if (pArgs->PreviousExecutionState == ApplicationExecutionState::Running) 64 { 65 Window::Current->Activate(); 66 return; 67 } 68 69 // Create a Frame to act as the navigation context and associate it with 70 // a SuspensionManager key 71 auto rootFrame = ref new Frame(); 72 SuspensionManager::RegisterFrame(rootFrame, "AppFrame"); 73 74 auto prerequisite = task<void>([](){}); 75 if (pArgs->PreviousExecutionState == ApplicationExecutionState::Terminated) 76 { 77 // Restore the saved session state only when appropriate, scheduling the 78 // final launch steps after the restore is complete 79 prerequisite = SuspensionManager::RestoreAsync(); 80 } 81 prerequisite.then([=]() 82 { 83 // When the navigation stack isn't restored navigate to the first page, 84 // configuring the new page by passing required information as a navigation 85 // parameter 86 if (rootFrame->Content == nullptr) 87 { 88 if (!rootFrame->Navigate(TypeName(MainPage::typeid))) 89 { 90 throw ref new FailureException("Failed to create initial page"); 91 } 92 } 93 94 // Place the frame in the current Window and ensure that it is active 95 Window::Current->Content = rootFrame; 96 Window::Current->Activate(); 97 }, task_continuation_context::use_current()); 98 } 99 100 /// <summary> 101 /// Invoked when application execution is being suspended. Application state is saved 102 /// without knowing whether the application will be terminated or resumed with the contents 103 /// of memory still intact. 104 /// </summary> 105 /// <param name="sender">The source of the suspend request.</param> 106 /// <param name="e">Details about the suspend request.</param> 107 void App::OnSuspending(Object^ sender, SuspendingEventArgs^ e) 108 { 109 (void) sender; // Unused parameter 110 111 auto deferral = e->SuspendingOperation->GetDeferral(); 112 SuspensionManager::SaveAsync().then([=]() 113 { 114 deferral->Complete(); 115 }); 116 } 117