none
Créer un processus en arrière plan avec WPF RRS feed

  • Question

  • Bonjour,

    En ce moment je développe une application WPF de sauvegarde automatique (qui s'exécute en arrière plan donc). J'ai défini ma GUI qui permet de configurer le logiciel et de voir la progression des sauvegardes, ainsi on peut afficher/cacher la fenêtre en cliquant sur un NotifyIcon.

    Le problème est le suivant : l'application apparaît (dans le Gestionnaire des tâches) dans le groupe "Applications" et non dans "Processus en arrière-plan", puis la combinaison Alt+Tab révèle l'application ce qui est gênant.

    J'ai cherché sur internet et pour que mon application apparaisse dans le groupe "Processus en arrière-plan" je dois définir ma propre méthode d'entrée static Main() cependant je ne comprends pas encore toutes les subtilités..

    Dois-je laisser le :

    app.InitializeComponent();
    app.Run();

    Mon application étant structuré en MVVM comment faire pour éviter de recharger tout les ModelViews et les Views...etc ?

    Cordialement.



    • Modifié Apyn AOM jeudi 20 août 2015 12:37
    jeudi 20 août 2015 12:32

Réponses

Toutes les réponses

  • Bonjour Apyn,

    select la App.xaml dans le Solution Explorer. Dans la "Properties" changes le "Build Action" de "Application Definition" à "Page"

    Dans l'App.xaml, enleves la StartupUri-Attribute:

    <Application x:Class="WpfApplication5.App"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:local="clr-namespace:WpfApplication5"
                 StartupUri="MainWindow.xaml">
        <Application.Resources>
             
        </Application.Resources>
    </Application>

    Defines la custom Main dans un nouveau Program-class

    Voila

      class Program
      {
        [STAThread]
        public static void Main(string[] args)
        {
          var mainWindow = new MainWindow();
          var app = new App();
          app.InitializeComponent();
          app.Run(mainWindow);
        }
      }


    Thomas Claudius Huber

    "If you can't make your app run faster, make it at least look & feel extremly fast"

    My latest Pluralsight-courses:
    XAML Layout in Depth
    Windows Store Apps - Data Binding in Depth

    twitter: @thomasclaudiush
    homepage: www.thomasclaudiushuber.com


    vendredi 21 août 2015 17:33
  • Bonjour Thomas,

    Merci de votre réponse mais cela ne m'aide pas vraiment car j'ai déjà trouvé ça sur internet..

    Par exemple, quel est l'intérêt de changer "Build Action" : ApplicationDefinition par Page ? Quel effet cela fait ?

    Je vais essayer de décrire le protocole que je pense :

    1. Une instance de MainWindow est créée et initialisée.
    2. Aucune fenêtre n'est lancé car le programme s'exécute en arrière-plan ("Background process" dans Task Manager)
    3. Un NotifyIcon est présent dans la barre des tâches indiquant que le logiciel est ouvert.
    4. Lorsque l'utilisateur clique sur le NotifyIcon le MainWindow est affiché (mainWindow.ShowDialog() par exemple) et s'appui sur les classes qui ont déjà été initialisés avec MainWindow à l'étape 1.
    5. Lorsque l'utilisateur réduit/ferme la fenêtre MainWindow, celle-ci se ferme (invisible dans la barre des tâches et le programme rebascule dans le groupe "Background process" dans le Task Manager)
    6. Si l'utilisateur clique une nouvelle fois sur le NotifyIcon, le MainWindow est ré-affiché mais sans réinitalisé tout les ModelView.

    J'espère que j'ai réussi à être clair même s'il y a beaucoup d'informations :p

    Merci !


    PS : Vous pouvez répondre en anglais si vous le souhaitez, je comprends bien.
    • Modifié Apyn AOM vendredi 21 août 2015 20:53
    vendredi 21 août 2015 20:43
  • Bonjour apyn,

    d'accord, anglais is much better for me. :-)

    Ok, I think I know what you want. You want a NotifyIcon and only one single WPF-Window, right?

    I've just created a blog-post here:

    http://www.thomasclaudiushuber.com/blog/2015/08/22/creating-a-background-application-with-wpf/

    Add the end of the post you find a link to download a sample project.


    Thomas Claudius Huber

    "If you can't make your app run faster, make it at least look & feel extremly fast"

    My latest Pluralsight-courses:
    XAML Layout in Depth
    Windows Store Apps - Data Binding in Depth

    twitter: @thomasclaudiush
    homepage: www.thomasclaudiushuber.com


    samedi 22 août 2015 11:17
  • Thank you so much ! This is exactly what I wanted :D

    I will now follow you on your blog.

    If I can suggest something, I think it's better to set a icon in Project Properties and Resources then acces with Properties.Resources.MyIcon in code behind.

    Bye and thank you !

    samedi 22 août 2015 11:40
  • Thanks for your suggestion. You're right, that's the way to use it in Windows Forms. I've adjusted it in the Blog-post and in the downloadable sample

    Thomas Claudius Huber

    "If you can't make your app run faster, make it at least look & feel extremly fast"

    My latest Pluralsight-courses:
    XAML Layout in Depth
    Windows Store Apps - Data Binding in Depth

    twitter: @thomasclaudiush
    homepage: www.thomasclaudiushuber.com

    samedi 22 août 2015 12:27