Comment arrêter une application WPF après 'n' secondes d'inactivité?Arrêter l'application WPF après n secondes d'inactivité
Répondre
Un peu en retard, mais je suis venu avec ce code, il redémarre une minuterie sur un événement d'entrée:
public partial class Window1 : Window {
DispatcherTimer mIdle;
private const long cIdleSeconds = 3;
public Window1() {
InitializeComponent();
InputManager.Current.PreProcessInput += Idle_PreProcessInput;
mIdle = new DispatcherTimer();
mIdle.Interval = new TimeSpan(cIdleSeconds * 1000 * 10000);
mIdle.IsEnabled = true;
mIdle.Tick += Idle_Tick;
}
void Idle_Tick(object sender, EventArgs e) {
this.Close();
}
void Idle_PreProcessInput(object sender, PreProcessInputEventArgs e) {
mIdle.IsEnabled = false;
mIdle.IsEnabled = true;
}
}
Vous aurez besoin de définir «activité», mais vous voulez démarrer une minuterie. Ensuite, chaque fois qu'il y a une "activité" (qu'il s'agisse de clics de souris ou de mouvements de souris, etc.), la minuterie est réinitialisée. Puis dans le temporisateur lorsqu'il atteint votre limite, envoyez un événement pour appeler la méthode de fermeture de l'application.
Les activités comprennent l'interaction utilisateur et le fonctionnement fait par application en fil de premier plan/arrière-plan. – Raj
@Raj - si vous avez besoin d'enregistrer des opérations, vous pouvez envisager une approche orientée aspect où vous déclenchez un événement à l'entrée et à la sortie de toutes les méthodes opérationnelles qui réinitialiseraient le temporisateur. – ChrisF
Il y avait une discussion dans msdn social à ce sujet. Vérifiez et s'il vous plaît poster ce qui ne fonctionne pour vous ....
Je vous collez le code de la discussion (celui que je pense que ça va faire ce que vous avez besoin):
public partial class Window1 : Window
{
private EventHandler handler;
public Window1()
{
InitializeComponent();
handler = delegate
{
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(4);
timer.Tick += delegate
{
if (timer != null)
{
timer.Stop();
timer = null;
System.Windows.Interop.ComponentDispatcher.ThreadIdle -= handler;
MessageBox.Show("You get caught!");
System.Windows.Interop.ComponentDispatcher.ThreadIdle += handler;
}
};
timer.Start();
//System.Windows.Interop.ComponentDispatcher.ThreadIdle -= handler;
Dispatcher.CurrentDispatcher.Hooks.OperationPosted += delegate
{
if (timer != null)
{
timer.Stop();
timer = null;
}
};
};
ComponentDispatcher.ThreadIdle += handler;
}
}
ComponentDispatcher.ThreadIdle se déclenche correctement, mais Dispatcher.CurrentDispatcher.Hooks.OperationPosted pompe des événements même si je minimise la fenêtre qui arrête essentiellement le minuteur. – Raj
public MainWindow()
{
InitializeComponent();
var timer = new DispatcherTimer {Interval = TimeSpan.FromSeconds(10)};
timer.Tick += delegate
{
timer.Stop();
MessageBox.Show("Logoff trigger");
timer.Start();
};
timer.Start();
InputManager.Current.PostProcessInput += delegate(object s, ProcessInputEventArgs r)
{
if (r.StagingItem.Input is MouseButtonEventArgs || r.StagingItem.Input is KeyEventArgs)
timer.Interval = TimeSpan.FromSeconds(10);
};
}
Conservez cette ligne de code dans le constructeur de votre fenêtre principale ou dans l'événement de chargement de formulaire si vous souhaitez activer l'événement de déconnexion automatique après un prétraitement. – sam
- 1. Fermer la liste déroulante après n secondes
- 2. Comment arrêter le thread asynchrone après 5 secondes de fonctionnement
- 3. Terminal Run Code pendant n secondes
- 4. App se bloque après quelques secondes
- 5. déclencher une fonction jQuery n secondes après l'affichage de l'onglet/fenêtre
- 6. JavaScript pour Soumettre Page Après 30 Secondes
- 7. Délai HTTP 504 après exactement 120 secondes
- 8. JQuery supprimer .append après 5 secondes
- 9. gestionnaire de CLLocation jette après ~ 30 secondes
- 10. Div apparaît après 5 secondes Jquery
- 11. Comment fermer les fenêtres après 5 secondes?
- 12. affiche une nouvelle vue après x secondes?
- 13. JQuery (charger l'image, rétrécir après x secondes)
- 14. supprimer nouveau div après 5 secondes
- 15. ActiveMq NMS Déconnecte après environ 30 secondes
- 16. Comment faire pour MouseDown après quelques secondes?
- 17. Comment rediriger JSF après quelques secondes
- 18. auto masquer div après 2 secondes
- 19. Scripts PHP ne répond pas après 120 secondes
- 20. Comment arrêter l'exécution après un certain temps en Java?
- 21. Comment afficher une grille pendant quelques secondes dans WPF?
- 22. Puis-je arrêter std :: cout flush sur "\ n"?
- 23. PyUnit: arrêter après le premier test d'échec?
- 24. Comment arrêter fancybox iframe après soumettre
- 25. comment arrêter l'animation après l'utilisation de beginAnimations?
- 26. Split HTML après N mots en python
- 27. Comment puis-je configurer Apache2/mod_python/Django pour annuler le traitement de la requête après N secondes?
- 28. Arrêter le double clic après un seul clic
- 29. manuel d'fadeout (sur clic) avec automatique (après quelques secondes)
- 30. Comment déclencher une alarme après 2 secondes sur l'iPhone
Il y a un problème que j'ai trouvé récemment: Lorsqu'une zone de texte est mise au point et que la souris survole la fenêtre, l'événement PreProcessInput déclenche constamment. Lorsque vous déplacez la souris en dehors de la fenêtre ou que vous désactivez la zone de texte, cela fonctionne correctement. Est-ce que c'est moi qui fais quelque chose de mal? – PVitt
FYI: J'ai essayé votre solution et j'ai du mal à comprendre exactement quand l'événement 'PreProcessInput' est déclenché. Vous pouvez trouver ma question ici: http://stackoverflow.com/questions/4963135/wpf-inactivity-and-activity –
@ Martin, je ne sais pas, le modèle d'objet WPF est beaucoup trop compliqué. Je pense que vous devrez explorer l'objet PreProcessInputEventArgs et récupérer des informations pour savoir d'où cela vient. Vous avez également une chance de le filtrer. –