UWP sur le bureau fermé par le bouton X supérieur – aucun événement

Une application UWP qui s’exécute sur le bureau peut être fermée à partir du bouton X supérieur, mais elle n’a aucun événement. Il est connu que sur les téléphones et les tablettes, une application doit s’appuyer sur un événement en cours de Suspending , quelle que soit la manière dont il est déclenché. L’application doit ensuite s’appuyer sur ApplicationExecutionState .

Cependant, voici un scénario (peut-être) commun: sur les téléphones, l’événement de Suspending suffisant et si un appel Voip est en cours, il sera exploité par le système d’exploitation après la suspension de l’application. Sur le bureau, le bouton de fermeture devrait, par utilisateur, fermer complètement l’application. Donc, si un appel est en cours, il devrait être raccroché et certaines ressources libérées.

Comment puis-je savoir quand l’utilisateur a cliqué sur le bouton “fermer” si (et seulement si) l’application UWP s’exécute sur le bureau?

Une fonctionnalité restreinte confirmAppClose été ajoutée dans Windows 10 version 1703 (version 10.0.15063) afin de permettre aux applications d’intercepter la fermeture de la fenêtre.

Espace de noms manifeste:

 xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/ressortingctedcapabilities" 

Manifeste:

     

Il faut une approbation supplémentaire lors de la soumission au magasin. Mais alors déclenchera l’événement CloseRequested sur une instance de SystemNavigationManagerPreview .

Code:

  public MainPage() { this.InitializeComponent(); SystemNavigationManagerPreview.GetForCurrentView().CloseRequested += this.OnCloseRequest; } private void OnCloseRequest(object sender, SystemNavigationCloseRequestedPreviewEventArgs e) { if (!saved) { e.Handled = true; SomePromptFunction(); } } 

Vous pouvez obtenir un report pour effectuer un peu de travail ici (enregistrer ou inviter), ou vous pouvez définir Handled sur true pour empêcher la fermeture de la fenêtre (invite annulée par l’utilisateur).

Depuis la page officielle sur le cycle de vie de l’application:

Il n’y a pas d’événement spécial pour indiquer que l’utilisateur a fermé l’application.

Comportement fermé par utilisateur: si votre application doit faire quelque chose de différent lorsqu’elle est fermée par l’utilisateur que si elle est fermée par Windows, vous pouvez utiliser le gestionnaire d’événements d’activation pour déterminer si l’application a été arrêtée par l’utilisateur ou par Windows. .

Donc, selon cela, il n’y a pas de moyen (clair) de savoir si l’utilisateur a fermé l’application avant la fermeture de l’application, mais seulement après son redémarrage. Dommage.

J’ai supprimé ma réponse d’origine avec l’événement Window.Current.Closed , car cela ne semble pas fonctionner si vous ne possédez qu’une seule instance de Window. Il existe également CoreApplication.Exiting , mais à en juger par ce sujet, il ne fonctionne pas non plus. Semble être un problème connu qui pourrait être corrigé à l’avenir. À la fin, il semble qu’il n’y ait pas de moyen clair de déterminer quand l’application va être fermée, mais seulement quand elle est suspendue.

Cependant, Window.Current déclenche l’événement VisibilityChanged lorsque l’application est fermée. Le problème, c’est qu’elle est également déclenchée lorsque l’application est réduite au minimum, voire dans d’autres cas. Mais je pense qu’avec la Suspending vous pouvez (plus ou moins) déterminer en toute sécurité que l’application de bureau se ferme. Le bon côté est que VisibilityChanged déclenché avant la Suspending et que vous pouvez enregistrer sa valeur et la vérifier dans le gestionnaire OnSuspending , après quoi décider si vous devez effectuer un nettoyage ou un autre travail.