Comment créer une application Windows Forms .NET qui ne s'exécute que dans la barre d'état système?

217

Que dois-je faire pour exécuter une application Windows Forms dans la barre d'état système?

Pas une application qui peut être réduite dans le bac, mais une qui n'existe que dans le bac, avec rien de plus qu'une icône, une info-bulle et un menu "clic droit".

xyz
la source
9
Il manque quelque chose dans la plupart des réponses - n'oubliez pas de définir icon.Visible = false, puis Dispose()l'icône lorsque vous quittez votre application. Sinon, vous verrez toujours l'icône après la fin de votre programme. Après l'avoir testé plusieurs fois, vous ne saurez plus quelle icône est réelle.
Tomasz Gandor
Si vous recherchez une approche WPF plus moderne - vous pouvez essayer ceci: codeproject.com/Articles/36788/…
Murray Foxcroft

Réponses:

86

L'article de projet de code Création d'une application Tasktray donne une explication très simple et un exemple de création d'une application qui n'existe que dans la barre d'état système.

Modifiez simplement la Application.Run(new Form1());ligne Program.cspour démarrer une classe qui hérite de ApplicationContextet que le constructeur de cette classe initialise unNotifyIcon

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        Application.Run(new MyCustomApplicationContext());
    }
}


public class MyCustomApplicationContext : ApplicationContext
{
    private NotifyIcon trayIcon;

    public MyCustomApplicationContext ()
    {
        // Initialize Tray Icon
        trayIcon = new NotifyIcon()
        {
            Icon = Resources.AppIcon,
            ContextMenu = new ContextMenu(new MenuItem[] {
                new MenuItem("Exit", Exit)
            }),
            Visible = true
        };
    }

    void Exit(object sender, EventArgs e)
    {
        // Hide tray icon, otherwise it will remain shown until user mouses over it
        trayIcon.Visible = false;

        Application.Exit();
    }
}
Fawzan Izy
la source
13
C'est un excellent point de départ. Notez que "AppIcon" doit être le nom d'une ressource que vous ajoutez avec "Projet -> Propriétés -> Ressources -> Ajouter une ressource", puis recompilez le projet.
Lavamantis
1
J'ai fait des propriétés..ressources..ajouter une ressource..icon .. recompilé, obtenez toujours "Erreur CS0103 Le nom 'Resources' n'existe pas dans le contexte actuel"
barlop
@barlop Je devais l'écrire comme ceci: Properites.Resources.AppIcon
Simon Perepelitsa
@SimonPerepelitsa merci, je ne sais pas ce que j'ai fait dans mes expériences, je voulais commenter ce qui a fonctionné mais j'ai dû oublier certaines des choses que j'ai faites qui ont fonctionné. Mais finalement, la méthode que j'ai utilisée consistait à faire glisser une icône de notification à partir de la palette de choses que vous pouvez faire glisser. Puis en cliquant dessus dans le formulaire, en cliquant sur une petite flèche qui fait apparaître un menu pour y choisir une icône!
barlop
18

Comme le dit mat1t - vous devez ajouter un NotifyIcon à votre application, puis utiliser quelque chose comme le code suivant pour définir l'info-bulle et le menu contextuel:

this.notifyIcon.Text = "This is the tooltip";
this.notifyIcon.ContextMenu = new ContextMenu();
this.notifyIcon.ContextMenu.MenuItems.Add(new MenuItem("Option 1", new EventHandler(handler_method)));

Ce code affiche l'icône dans la barre d'état système uniquement:

this.notifyIcon.Visible = true;  // Shows the notify icon in the system tray

Les éléments suivants seront nécessaires si vous avez un formulaire (pour une raison quelconque):

this.ShowInTaskbar = false;  // Removes the application from the taskbar
Hide();

Le clic droit pour obtenir le menu contextuel est géré automatiquement, mais si vous souhaitez effectuer une action sur un clic gauche, vous devrez ajouter un gestionnaire de clic:

    private void notifyIcon_Click(object sender, EventArgs e)
    {
        var eventArgs = e as MouseEventArgs;
        switch (eventArgs.Button)
        {
            // Left click to reactivate
            case MouseButtons.Left:
                // Do your stuff
                break;
        }
    }
ChrisF
la source
15

J'ai écrit une application de barre d'outils avec .NET 1.1 et je n'avais pas besoin d'un formulaire.
Tout d'abord, définissez l'objet de démarrage du projet en tant que Sub Main, défini dans un module.
Créez ensuite par programmation les composants: les NotifyIconet ContextMenu.
Assurez-vous d'inclure un MenuItem"Quitter" ou similaire.
Liez le ContextMenuà NotifyIcon.
Invoquez Application.Run().
Dans le gestionnaire d'événements pour Quit, MenuItemassurez-vous d'appeler set NotifyIcon.Visible = False, alors Application.Exit(). Ajoutez ce dont vous avez besoin ContextMenuet manipulez correctement :)

M.Turrini
la source
11
  1. Créez une nouvelle application Windows avec l'assistant.
  2. Supprimer Form1du code.
  3. Supprimez le code dans Program.cs en démarrant le Form1.
  4. Utilisez la NotifyIconclasse pour créer l'icône de la barre d'état système (attribuez-lui une icône).
  5. Ajoutez-y un menu contextuel.
  6. Ou réagissez au NotifyIconclic de souris et faites la différence entre le clic droit et le clic gauche, en définissant votre menu contextuel et en lui montrant pour quel bouton (droit / gauche) vous avez appuyé.
  7. Application.Run()pour continuer à utiliser l'application Application.Exit()pour quitter. Ou a bool bRunning = true; while(bRunning){Application.DoEvents(); Thread.Sleep(10);}. Ensuite, configurez bRunning = false;pour quitter l'application.
Wolf5
la source
Le programme cesse de s'exécuter lorsque vous atteignez la fin de Main et n'a pas de thread d'interface utilisateur. Comment prenez-vous soin de cette solution? Si vous avez résolu ces problèmes, vous obtenez mon vote :)
Matthew Steeples
Vous obtenez mon vote. Peut-être mentionnez-vous simplement que vous devez toujours appeler Application.Run sans aucun paramètre?
Mis à jour avec une alternative à App.Run.
Wolf5
Le thread.sleep est exagéré, je sais, mais si vous avez une meilleure alternative de boucle de "sommeil" à Application.Run, postez-le :)
Wolf5
Thread.Sleep est une mauvaise idée: vous finirez par utiliser plus de CPU et de batterie que si vous venez de faire Application.Run comme vous êtes censé le faire.
Sneftel
9

L'application "Barre d'état système" est juste une application régulière de formulaires gagnants, la seule différence est qu'elle crée une icône dans la zone de la barre d'état système de Windows. Afin de créer une icône sys.tray, utilisez le composant NotifyIcon, vous pouvez le trouver dans la boîte à outils (contrôles communs) et modifier ses propriétés: icône, infobulle. Il vous permet également de gérer les messages de clic de souris et de double-clic.

Et encore une chose, afin d'obtenir l'apparence et la sensation ou l'application de plateau standard. ajoutez des lignes de suivi sur votre événement principal de présentation de formulaire:

private void MainForm_Shown(object sender, EventArgs e)
{
    WindowState = FormWindowState.Minimized;
    Hide();
} 
Gordon Freeman
la source
7

Pour autant que je sache, vous devez toujours écrire l'application à l'aide d'un formulaire, mais ne pas avoir de contrôle sur le formulaire et ne jamais le rendre visible. Utilisez NotifyIcon (dont vous trouverez un exemple MSDN ici ) pour rédiger votre application.

Matthew Steeples
la source
1
Pas assez. Vos formulaires peuvent contenir des contrôles, mais ils doivent être masqués par défaut.
Rune Grimstad
5
Vous n'avez besoin d'aucun formulaire. Après un nouvel assistant de création d'application Windows, supprimez simplement Form1 et supprimez le code l'ouvrant. Vous pouvez tout écrire à partir de Program.cs avec NotifyIcon et ContextMenu dessus. Rien de plus requis.
Wolf5
1
Je sais qu'il peut contenir des contrôles, mais OP ne le veut pas
Matthew Steeples
2

Voici comment je l'ai fait avec Visual Studio 2010 , .NET 4

  1. Créez une application Windows Forms, définissez «Créer une application à instance unique» dans les propriétés
  2. Ajouter un ContextMenuStrip
  3. Ajoutez des entrées à la bande du menu contextuel, double-cliquez dessus pour obtenir les gestionnaires, par exemple, 'exit' (double-cliquez) -> gestionnaire -> moi.Close ()
  4. Ajoutez un NotifyIcon, dans l'ensemble de concepteurs contextMenuStrip à celui que vous venez de créer, choisissez une icône (vous pouvez en trouver dans le dossier VisualStudio sous 'common7 ...')
  5. Définissez les propriétés du formulaire dans le concepteur: FormBorderStyle: none, ShowIcon: false, ShowInTaskbar: false, Opacity: 0%, WindowState: Minimized
  6. Add Me.Visible = false à la fin de Form1_Load, cela masquera l'icône lors de l'utilisation de Ctrl+Tab
  7. Exécutez et ajustez au besoin.
Évolué
la source
2

C'est un cadre très convivial pour l'application de zone de notification ... il suffit d'ajouter NotificationIcon au formulaire de base et de changer le code généré automatiquement en code ci-dessous:

public partial class Form1 : Form
{
    private bool hidden = false;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.ShowInTaskbar = false;
        //this.WindowState = FormWindowState.Minimized;
        this.Hide();
        hidden = true;
    }

    private void notifyIcon1_Click(object sender, EventArgs e)
    {
        if (hidden) // this.WindowState == FormWindowState.Minimized)
        {
            // this.WindowState = FormWindowState.Normal;
            this.Show();
            hidden = false;
        }
        else
        {
            // this.WindowState = FormWindowState.Minimized;
            this.Hide();
            hidden = true;
        }
    }
}
Sebastian Xawery Wiśniowiecki
la source
-2

Ajoutez simplement

this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false;

à votre objet de formulaire. Vous ne verrez qu'une icône dans la barre d'état système.

YTerle
la source
Cela place le formulaire au - dessus de la barre des tâches. Pas la même chose. Essayez-vous de répondre à un autre message?
LarsTech
1
Il n'y a pas d'icône sur la barre des tâches, nous ne voyons pas de formulaire. Le programme visuel n'existe que dans la barre d'état système. Que signifie ci - dessus ?
YTerle
Votre réponse ne contient aucun contexte. Utilisez-vous la classe NotifyIcon? Sinon, votre formulaire se réduit simplement dans le coin inférieur gauche au-dessus de la barre des tâches.
LarsTech
1
Si vous n'êtes pas occupé, essayez d'écrire et de l'exécuter.
YTerle