2010-08-06 5 views
16

J'écris une application de formulaire de Windows dans. Net using C#.Comment gérer correctement les modes Veille prolongée/Veille dans une application WinForms?

Je rencontre un problème si mon programme est en cours d'exécution lorsque l'ordinateur passe en état de veille et/ou d'hibernation (je ne suis pas sûr à ce moment-là, ou des deux, du problème), la machine se réveille à nouveau le programme se bloque. La seule façon d'en sortir est de tuer le processus du gestionnaire de tâches.

Ceci est, pour des raisons évidentes, pas la façon dont je veux que le programme fonctionne. Même si je ferme juste le programme quand il passe dans ces états, ce serait bien, mais je ne suis pas sûr de savoir comment faire cela ou s'il y a une façon plus gracieuse de gérer cela.

+0

Je ne sais pas pourquoi vous avez mentionné Visual Studio. Le problème ne se produit-il que lorsque vous déboguez dans Visual Studio et que vous hibernez/dormez? Ou avez-vous vérifié que cela se produit avec une coupure de presse avec VS fermé? –

+1

Peut-être que ce sont des informations superflues, mais je voudrais simplement donner autant (ce que je crois) d'informations pertinentes que je peux en présentant une question. Pour répondre à votre question, il se passe certainement sur la version de sortie sur une machine qui n'a même pas de studio visuel dessus. – EatATaco

+0

Si vous souhaitez fournir des informations pertinentes, vous ne devez pas fournir d'informations non pertinentes. "Visual Studio" n'a rien à voir avec votre question. –

Répondre

8

Vous devez:

using Microsoft.Win32; 

Et ceci est le code:

void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e) 
    { 
     if(e.Mode == PowerModes.Suspend) 
     { 
      this.GracefullyHandleSleep(); 
     } 
    } 

C'est ce que je suis allé avec.

2

Cette article couvre l'écoute de ces événements. Vous devrez faire quelque chose comme remplacer WndProc et écouter les événements PBT_APMSUSPEND.

6

La gestion de ces événements peut être une solution de rechange. Mais avant d'appliquer ce type de travail, j'essayerais de comprendre ce que l'application faisait quand le système d'exploitation est passé en mode hibernation.

Se produit-il pendant que l'application était simplement inactive?

L'application effectue-t-elle un travail de bas niveau (communication avec des pilotes de périphériques ou du matériel externe) qui ne doit pas être interrompu? L'application utilise-t-elle une sorte de connexion réseau?

+0

Il interroge un port série toutes les secondes et j'utilise la classe de port série intégrée. Mon instinct me dit que c'est ce qui cause le problème car j'ai eu un certain nombre de problèmes avec des bogues connus dans la classe VS port série. Mais même alors, la solution la plus rapide est de simplement arrêter le programme et nous avons subi beaucoup de contraintes de temps récemment, donc je vais probablement le faire pour résoudre TOUS les problèmes potentiels. – EatATaco

+0

OK. Essayez de fermer le port série lorsque vous recevez hibernate/sleep/standby et ouvrez-le après que le système d'exploitation soit de nouveau opérationnel. –

+0

+1 pour aller à la racine du problème :) –

Questions connexes