none
Comment faire une application C# pour interrompre l’arrêt de Windows RRS feed

  • Discussion générale

  • Si on ferme l’ordinateur quand on a déjà quelques applications ouvertes, le système d’exploitation annonce l’utilisateur avant d’arrêter. Toutefois, l’utilisateur n’a pas toujours le temps nécessaire pour réagir, s’il veut annuler la commande d’arrêt, et il perd des informations qui n’ont pas été enregistrés.

     

    Il est possible de développer une application C# qui intervient dans le processus d’arrêt et qui empêche Windows de fermer l’ordinateur.

     

    Pour empêcher l’arrêt de Windows, on utilise la fonction ShutdownBlockReasonCreate. En fournissant en paramètre le hWnd de l’application et un string contenant l’explication, on peut appeler cette fonction avant le commencement d’une opération qui ne doit pas être interrompue (graver un DVD, par exemple).

     

    Quand on veut permettre l’arrêt de Windows, on appelle la fonction ShutdownBlockReasonDestroy.

     

    Voici un exemple d’application qui bloque l’arrêt de Windows et ensuite le débloque, suivant les commandes de l’utilisateur.

     

    Créez une application de type Windows Forms et ajoutez un TextBox et deux Boutons sur le formulaire par défaut. Le premier bouton aura le texte « Bloque » et le deuxième « Débloque ». Dans le TextBox l’utilisateur écrit la raison pour empêcher l’arrêt de Windows, qui sera utilisé comme paramètre dans la fonction ShutDownBlockReasonCreate.

     

    Ajoutez ce code :

     

    public partial class Form1 : Form
      {
        [DllImport("user32.dll")]
        public extern static bool ShutdownBlockReasonCreate(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)] string pwszReason);
     
        [DllImport("user32.dll")]
        public extern static bool ShutdownBlockReasonDestroy(IntPtr hWnd);
     
     
     
        private bool blocked = false;
     
        protected override void WndProc(ref Message aMessage)
        {
          const int WM_QUERYENDSESSION = 0x0011;
          const int WM_ENDSESSION = 0x0016;
     
          if (blocked && (aMessage.Msg == WM_QUERYENDSESSION || aMessage.Msg == WM_ENDSESSION))
            return;
     
          base.WndProc(ref aMessage);
        }
     
        
        public Form1()
        {
          InitializeComponent();
        }
     
        private void button1_Click(object sender, EventArgs e)
        {
          if (ShutdownBlockReasonCreate(this.Handle, textBox1.Text))
          {
            blocked = true;
            MessageBox.Show("Shutdown blocking succeeded");
          }
          else
            MessageBox.Show("Shutdown blocking failed");
     
        }
     
        private void button2_Click(object sender, EventArgs e)
        {
          if (ShutdownBlockReasonDestroy(this.Handle))
          {
            blocked = false;
            MessageBox.Show("Shutdown unblocking succeeded");
          }
          else
            MessageBox.Show("Shutdown unblocking failed");
     
        }
      }
    

     

     

    Pour plusieurs questions sur Visual Basic .NET, visitez Foire aux Questions – C# FAQ et Tutoriels


    Suivez MSDN sur Twitter 

    mardi 11 janvier 2011 13:37

Toutes les réponses

  • Salut, pourquoi pas passer par la commande shutdown -a

     

    Beaucoup plus simple :)

    samedi 2 avril 2011 13:37
  • Bonjour,

    Le but n'est pas de lancer après coup une commande qui va interrompre l'arrêt de Windows.

    Le but est de pouvoir signaler à Windows depuis sa propre application que, au cas où l'utilisateur demanderait un arrêt de Windows pendant l'exécution de cette application, il faudrait alors lui signaler que cette application ne devrait pas être interrompue et lui demander confirmation (Windows affiche alors la liste des applications en cours avec le message qui indique pourquoi l'application ne devrait pas être interrompue et il peut alors forcer l'arrêt ou l'annuler).


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    samedi 9 avril 2011 19:31
    Modérateur