273 votes

Comment puis-je faire une application .NET Windows Forms qui s’exécute uniquement dans la barre d’état système ?

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

Pas une application qui peut réduire dans la barre d’État, mais qui n’existe que dans la barre d’État, avec rien de plus qu’une icône, info-bulle et menu « clic droit ».

153voto

Michael Sorens Points 9637

Les réponses de base de l'utilisation d'un NotifyIcon est correct, mais, comme pour beaucoup de choses .NET, il y a une foule de subtilités impliqués dans le faire droit. Le tutoriel mentionné par Brad donne un bon tour de toutes les bases, mais ne répondant à aucun de ces:

  • N'fermeture de l'application à partir de la barre d'état système correctement fermer toutes les formes d'enfants?
  • L'application d'appliquer qu'une seule instance de lui-même peut s'exécuter (applicable à la plupart, si pas tous, plateau apps) ?
  • Comment ouvrir WPF enfant de windows ainsi que les WinForms enfant de windows, si vous le souhaitez.
  • Comment soutenir le contexte dynamique des menus.
  • La norme NotifyIcon existe en WinForms de l'espace; puis-je faire un pur WPF solution? (Oui, vous le pouvez!)

J'ai juste eu un article publié sur Simple-Talk.com qui répond à ces points et plus dans le détail, offrant un plateau de cadre d'application que vous pouvez mettre en place immédiatement, plus complète, dans le monde réel exemple d'application de tout montrer dans la pratique. Voir Création de Tiroir d'Applications .NET: UN Guide Pratique, publié en novembre 2010.

151voto

Fawzan Izy Points 142

Le projet de code de l'article Création d'une barre des tâches de l'Application donne une explication très simple et l'exemple de la création d'une application qui n'a jamais existe dans la barre d'état Système.

Modifier fondamentalement l' Application.Run(new Form1()); ligne Program.cs au lieu de démarrer une classe qui hérite de l' ApplicationContext, et ont le constructeur pour cette classe d'initialiser un NotifyIcon

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();
    }
}

19voto

ChrisF Points 74295

Comme mat1t dit - vous avez besoin d'ajouter un NotifyIcon à votre application, puis d'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 quelque raison que ce soit):

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

Le clic droit pour obtenir le menu contextuel est gérée automatiquement, mais si vous voulez faire une action sur un clic gauche, vous aurez besoin d'ajouter un gestionnaire d'événements Click:

    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;
        }
    }

16voto

Turro Points 554

J'ai écrit un traybar app avec .NET 1.1 et je n'ai pas besoin d'un formulaire.
Tout d'abord, définir l'objet de démarrage du projet en tant que Sous - Main, défini dans un module.
Puis créer par programmation les composants: l' NotifyIcon et ContextMenu.
Assurez-vous d'inclure un MenuItem "Quitter" ou similaire.
Lier l' ContextMenu de la NotifyIcon.
Invoquer Application.Run().
Dans le gestionnaire d'événement pour la Quitter MenuItem assurez-vous d'établissement de l'appel, NotifyIcon.Visible = False, alors Application.Exit(). Ajouter ce dont vous avez besoin pour l' ContextMenu et de gérer correctement :)

14voto

Wolf5 Points 2906
  1. Créer une nouvelle Application Windows avec l'assistant.
  2. Supprimer Form1 à partir du code.
  3. Supprimer le code dans le Programme.cs démarrage de l' Form1.
  4. Utiliser l' NotifyIcon classe pour créer votre icône de plateau de système (assigner une icône).
  5. Ajouter un contextmenu.
  6. Ou réagir à l' NotifyIcons'clic de souris et différencier entre le Droit et le clic Gauche, le réglage de votre contextmenu et de montrer ce dont jamais le bouton (gauche/droite) a été pressée.
  7. Application.Run() pour garder l'application en cours d'exécution avec Application.Exit() à cesser de fumer. Ou un while(bRunning){Application.DoEvents;Thread.Sleep(10);}. Puis définissez bRunning = false pour quitter l'application.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X