none
"Transformer" une application windows forms en service windows RRS feed

  • Question

  • Bonjour à tous,

    Soit une application Windows Forms développée en VB .net.

    Cette application se lance automatiquement à l'ouverture du poste de travail. Pour cela, j'utilise le Groupe Démarrage et y est positionné le raccourci de l'application.

    Je voudrais maintenant que cette application puisse se lancer en temps que service windows.

    Faut-il pour cela recréer un projet de type Service  Windows et y 'basculer' l'application Windows Forms précédemment développée ou bien existe-t-il un moyen (astuce) permettant de réaliser cela plus rapidement ?

    Merci d'avance pour vos réponses.

    Jean-Marc

     

     

    samedi 2 octobre 2010 07:55

Réponses

  • Bonjour,

     

    Pour reduire au minimum le nombre de modifications dans votre application, vous pouvez rendre la fenetre principale invisible et utiliser un contrôle NotifyIcon pour afficher l’application en icone dans le taskbar.

     

    Definissez la propriete WindowState de la fenetre principale a « Minimized ». Ajoutez un contrôle de type NotifyIcon et choisissez une image de type .ico pour sa propriete Icon.

     

    Ajoutez aussi ce code pour rendre la fenetre invisible et pour la restaurer :

    private void Form1_Load(object sender, EventArgs e)

            {

                this.Visible = false;

               

            }

     

            private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)

            {

                this.Show();

                this.WindowState = FormWindowState.Normal;

            }

     

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Café des usages

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     

    • Marqué comme réponse Alex Petrescu lundi 11 octobre 2010 08:11
    lundi 4 octobre 2010 10:42

Toutes les réponses

  • Bonjour,

    Un service windows ne peut interagir avec l'interface graphique. C'est à dire que le service Windows ne pourra pas afficher des fenêtres Windows. Confirmez vous que votre application n'affiche pas de fenêtre Windows ou d'icones de notification dans la barre des tâches ?

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    dimanche 3 octobre 2010 12:22
    Modérateur
  • Bonjour,

    Tout d'abord merci pour votre réponse.

    En fait, je me demande si ce que je veux faire doit être vraiment réalisé par un service Windows tel que je l'entends.

    Je m'explique : j'ai développé une application Windows forms qui télécharge par ftp des fichiers et les affiche dans un treeview. Le lancement des téléchargement est automatique : aucune action sur un bouton quelconque n'est requise pour le lancer.

    Actuellement, j'ai mis dans le groupe de démarrage l'application et celle-ci s'exécute donc au lancement du poste de travail mais ... d'un point de vue utilisateur, la forms est visible à l'écran pendant ce téléchargement qui peut être, suivant les cas, relativement long.

    Je souhaitais donc faire évoluer l'application pour que au lancement de celle-ci elle se mette en icone dans la barre des taches (près de l'heure !) et démarre le téléchargement des fichiers de façon 'cachée' pour l'utilisateur.

    Je ne sais donc plus, suite à vos remarques, si c'est bien une application de type service windows qu'il faille que je crée ?!

    Vous pouvez me conformer/infirmer ?!

    Merci d'avance

    Jean-Marc

     

     

    dimanche 3 octobre 2010 12:37
  • Bonjour,

     

    Pour reduire au minimum le nombre de modifications dans votre application, vous pouvez rendre la fenetre principale invisible et utiliser un contrôle NotifyIcon pour afficher l’application en icone dans le taskbar.

     

    Definissez la propriete WindowState de la fenetre principale a « Minimized ». Ajoutez un contrôle de type NotifyIcon et choisissez une image de type .ico pour sa propriete Icon.

     

    Ajoutez aussi ce code pour rendre la fenetre invisible et pour la restaurer :

    private void Form1_Load(object sender, EventArgs e)

            {

                this.Visible = false;

               

            }

     

            private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)

            {

                this.Show();

                this.WindowState = FormWindowState.Normal;

            }

     

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Café des usages

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     

    • Marqué comme réponse Alex Petrescu lundi 11 octobre 2010 08:11
    lundi 4 octobre 2010 10:42
  • Bonsoir,

    Je pense que vous me mettez sur la bonne voie !

    En ayant compris que l'utilisation d'un service windows n'était pas adapté à ma problèmatique, j'étais en train de partir sur cette piste et vous m'en confortez.

    En revanche, j'ai un Form_load hyper long à se dérouler ( environ 50 secondes) et comme le minimized 'à l'air' de s'effectuer à la fin du form_load, l'utilisateur a donc la fenêtre visible à l'écran pendant ce temps la ...

    Je vais donc continuer à chercher. Je voulais transporter le code d'initialisation de mon appli. qu'il y a dans le form_load 'ailleurs', ceci afin de limiter le temps d'exécution du form_load mais je ne sais pas trop où le mettre !

    En tout cas merci.

    Cdt

    Jean-Marc

     

    lundi 4 octobre 2010 17:46
  • Bonjour,

     

    Est-ce que dans la méthode Load de votre formulaire vous avez placé toute la logique de l’application ?

     

    Cordialement,

    Alex

     

    ________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Café des usages

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

    mardi 5 octobre 2010 10:54
  • Bonjour Jean-Marc,

    En fonction du code contenu dans votre Form_Load, vous pouvez peut-être le déporter dans un thread, voir simplement dans un timer (avec un déclenchement unique), ce qui est encore plus simple. Attention toutefois si vous initialisez des contrôles, il faut dans ce cas synchroniser la méthode du thread/timer sur le thread principale en utilisant Invoke comme suit (il faut ajouter     using system.threading;    dans les déclarations)

        protected void myInitialisationThread()
        {
          if (this.InvokeRequired) // ce bloc est nescessaire si vous effectuez des modifications sur les controles contenus dans la form
          {
            this.Invoke(new ThreadStart(myInitialisationThread));
            return;
          }
          //....votre code ici.....
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
          new System.Threading.Thread(new ThreadStart(myInitialisationThread));
        }
    

    Par contre je viens de tester sous VS2010 et le framework .Net4, le minimized (WindowState=Minimized) se fait avant le form_load. Le problème de lenteur pour minimiser la fenêtre doit venir d'autre chose.

    Cordialement,

    Sébastien G.

    jeudi 7 octobre 2010 21:40
  • Bonjour Jean-Marc,

     

    Si ce problème est toujours d’actualité, je vous remercie de revenir avec des informations sur votre progrès.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Café des usages

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     

    vendredi 8 octobre 2010 07:26
  • Bonjour,

    Merci pour vos réponses.

    Je n'ai pu que seulement aujourd'hui mettre vos propostions en application.

    Il en ressort que :

    - le principe du NotifyIcon règle totalement ma problèmatique.

    - il ne me reste plus qu'à cacher l'application dans la barre des menus de Windows lorsqu'on la minimise.

    - concernant le minimized de la form principale, j'ai du rêver (!) car c'est vrai qu'il s'exécute avant le form_load !

    Donc tout fonctionne bien si ce n'est que je persiste à penser qu'un form_load qui dure 50 secondes n'est pas 'beau'.

    Je retiens donc le principe du thread que je trouve le plus élégant mais ... je pense que dans un premier temps je vais le jouer avec un Timer (moins élégant et plus facile à réaliser pour quelqu'un qui n'a jamais mais en place une application basée sur une notion de thread ;-) ).

    En tout cas merci encore

    Jean-Marc

     

     

    vendredi 8 octobre 2010 14:52
  • Bonsoir Jean-Marc,

     

    Attention tout de même, le timer créé un thread pour appeller l'evènement Tick (pour le nom... je peux me tromper).

    Si vous faites de modifications sur des composants visuels, il faudra ajouter le code d'invocation qui permet de se synchroniser au thread de la fenêtre (le même code que pour le thread dans ma réponse précédente).

     

    Cordialement,


    Kind regards, Cordialement, Sebastien G.
    vendredi 8 octobre 2010 22:34