Passer variable de winform à classe Program du projet [Résolu]

Signaler
Messages postés
60
Date d'inscription
lundi 5 juin 2017
Statut
Membre
Dernière intervention
3 mai 2021
-
Messages postés
16005
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 juin 2021
-
Bonjour,
Afin de détecter la fermeture de l application soit par un clic sur la croix rouge de winform ou par le gestionnaire de tache,
J ai trouver une fonction qui s implimente dans la classe program du projet,
J ai modifier le code en ajoutant une fonction qui inserre une ligne dans BD sqlserver pour récupérer la date du fermeture.
Le projet est un formulaire qui contient un textbox
Maintenant je veux récupérer ce champs dans la fonction sqlserver pour l enregiqtrer dans la base.
Merci d avance.

8 réponses

Messages postés
16005
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 juin 2021
549
Bonjour

dans ma boule de cristal, je vois qu'il manque un "demi" à la ligne 1664.

Ha pardon, tu voulais une réponse utile?
Nous ne sommes pas magicien, d'ailleurs, à ton précédent fil, tu n'as pas posé de question, donc t'as pas eu de réponse....

Si tu veux de l'aide, il faut nous donner de quoi comprendre de quoi tu parles.

Commence par la classe Program que tu as modifiée....

Rappel, pour poster un code il faut faire comme décrit sur ce petit tuto https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Messages postés
60
Date d'inscription
lundi 5 juin 2017
Statut
Membre
Dernière intervention
3 mai 2021

Rebonjour:

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Avancement_OFS
{
    static class Program
    {

  
        static Process checker;
        static Process main;
        static int mainProcessID;
     
        [STAThread]
      
        static void Main(string[] args)
        {
                    
            if (args.Length == 0)
            {
                //Saves current process info to pass on command line.
                main = Process.GetCurrentProcess();
                mainProcessID = main.Id;

                //Initializes the helper process
                checker = new Process();
                checker.StartInfo.FileName = main.MainModule.FileName;
                checker.StartInfo.Arguments = mainProcessID.ToString();

                checker.EnableRaisingEvents = true;
                checker.Exited += new EventHandler(checker_Exited);

                //Launch the helper process.
                checker.Start();

                Application.Run(new Authentification());
                
               
            }
            else //On the helper Process
            {
                main = Process.GetProcessById(int.Parse(args[0]));

                main.EnableRaisingEvents = true;
                main.Exited += new EventHandler(main_Exited);

                while (!main.HasExited)
                {
                    Thread.Sleep(9000); //Wait 1 second. 
                   
                }

                //Provide some time to process the main_Exited event. 
                Thread.Sleep(10000);
            }
        }

        static void checker_Exited(object sender, EventArgs e)
        {
           
            if (Process.GetProcessesByName("taskmgr").Length != 0)
            {
          SqlConnection cnx_save_trace = new SqlConnection(" Data Source=***;Initial Catalog=OFS_DEV;Integrated Security=True");

                SqlCommand cmd_save = new SqlCommand("insert into SUIVI_ACTIVITE_USER([USER_NAME],[DT])values(@name,@dt_s)", cnx_save_trace);
                cnx_save_trace.Open();
                cmd_save.Parameters.AddWithValue("@name",user);//Recuperer de la form Authentification

                cmd_save.Parameters.AddWithValue("@dt_s", DateTime.Now);


                cmd_save.ExecuteNonQuery();
                cnx_save_trace.Close();
                //MessageBox.Show("Task Manager killed helper process.");

                //If you like you could kill the main app here to. 
                //main.Kill();
            }
        }
        static void main_Exited(object sender, EventArgs e)
        {
           
            if (Process.GetProcessesByName("taskmgr").Length != 0)
            {
                SqlConnection cnx_save_trace = new SqlConnection(" Data Source=***;Initial Catalog=OFS_DEV;Integrated Security=True");

                SqlCommand cmd_save = new SqlCommand("insert into SUIVI_ACTIVITE_USER([USER_NAME],[DT])values(@name,@dt_s)", cnx_save_trace);
                cnx_save_trace.Open();
                cmd_save.Parameters.AddWithValue("@name",user);//Recuperer de la form Authentification

                cmd_save.Parameters.AddWithValue("@dt_s", DateTime.Now);


                cmd_save.ExecuteNonQuery();
                cnx_save_trace.Close();
            }
        }
    }
}

Messages postés
16005
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 juin 2021
549
Bonjour

Si je comprends bien ( j’ai pas pu tester pour l’instant, demain peut-être), tu lances le programme sans arguments.
Ça 2 effets
  • ça lance ta fenêtre principale
  • ça lance une seconde fois ton programme avec son propre nom en arguments.


C’est ce second lancement qui scrute si l’application a été tuée.

Dans ce cas l’appli est 2 fois dans le gestionnaire des taches, du coup si on tue le mauvais, il ne se passe rien? C’est correct?
Messages postés
16005
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 juin 2021
549
Bonsoir

j'ai fait quelques tests, j'ai modifié un peu le code pour écrire dans un fichier texte (j'allais pas crée une bdd rien que pour ça) et logguer un peu plus d'infos.

        static Process checker;
        static Process main;
        static int mainProcessID;

        /// <summary>
        /// Point d'entrée principal de l'application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                File.AppendAllText("log.txt", "Démarrage normal\r\n");

                //Saves current process info to pass on command line.
                main = Process.GetCurrentProcess();
                mainProcessID = main.Id;

                //Initializes the helper process
                checker = new Process();
                checker.StartInfo.FileName = main.MainModule.FileName;
                checker.StartInfo.Arguments = mainProcessID.ToString();

                checker.EnableRaisingEvents = true;
                checker.Exited += new EventHandler(checker_Exited);

                //Launch the helper process.
                checker.Start();

                Application.Run(new Form1());


            }
            else //On the helper Process
            {
                File.AppendAllText("log.txt", "Démarrage supervision\r\n");

                main = Process.GetProcessById(int.Parse(args[0]));

                main.EnableRaisingEvents = true;
                main.Exited += new EventHandler(main_Exited);

                while (!main.HasExited)
                {
                    Thread.Sleep(9000); //Wait 1 second. 

                }

                //Provide some time to process the main_Exited event. 
                Thread.Sleep(10000);
            }
        }


        static void checker_Exited(object sender, EventArgs e)
        {
            File.AppendAllText("log.txt", "checker_Exited\r\n");

            if (Process.GetProcessesByName("taskmgr").Length != 0)
            {
                File.AppendAllText("log.txt", string.Format("task manager ouvert à {0:yyyy-MM-DD_HH-mm-ss}\r\n", DateTime.Now));
            }
        }

        static void main_Exited(object sender, EventArgs e)
        {
            File.AppendAllText("log.txt", "main_Exited\r\n");

            if (Process.GetProcessesByName("taskmgr").Length != 0)
            {
                File.AppendAllText("log.txt", string.Format("task manager ouvert à {0:yyyy-MM-DD_HH-mm-ss}\r\n", DateTime.Now));
            }
        }


et ça correspond plus ou moins à ce que j'avais anticipé.

Il y a bien 2 "sous instances" de mon logiciel


Form1, c'est mon "vrai" logiciel" et "Test" c'est le checker.

Si je ferme normalement, ça passe dans main_Exited et si j'ai pas le gestionnaire des tache ouvert, ça ne loggue rien de plus, par contre s'il est ouvert ça me dit qu'il est ouvert (quand bien même je n'ai pas tué mon logiciel).
Les 2 sous instances sont éteintes.

Si je tue Form1, il se passe exactement la même chose, donc ton code ne distingue pas si le logiciel a été éteint "normalement" ou s'il a été "tué".

Si je tue le checker, ça loggue bien le passage dans checker_Exited et ça signale que le le gestionnaire des taches est ouvert.

Par contre, Form1 tourne toujours et plus rien n'est loggué par la suite.



Du coup, je ne voies pas l'intérêt de lancer le chercker.

Peux tu mettre le lien du site où tu avais trouvé ce code?


Messages postés
16005
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 juin 2021
549
En fait,je viens de m'apercevoir, que j'avais 8 processus de checker en arrière plan.....
Donc, ils ne se ferment pas comme il faut dans je ne sais pas quel cas.....

Messages postés
60
Date d'inscription
lundi 5 juin 2017
Statut
Membre
Dernière intervention
3 mai 2021

merci beaucoup pour la réponse,
est ce que je peux l'inserrer directement dans le code winfom.??

On oublie ce qu'on a appris, on n'oublie jamais ce qu'on a deviné.
Citation de Anne Barratin ; De toutes les paroisses (1913)
Messages postés
16005
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 juin 2021
549
  • je n’ai rien changé sur le fond de ton code (log dans un fichier texte au lieu d’une base de données)
  • je t’ai expliqué en quoi je ne le trouve pas génial ton truc
  • je t’ai demandé le lien vers le site où tu l’as trouvé (pour voir si tu l’avais adapté au mieux)


Et toi tu réponds
est ce que je peux l'inserrer directement dans le code winfom.??


Je ne te comprends pas....
Messages postés
16005
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 juin 2021
549
Ha c’est résolu finalement ?