web-dev-qa-db-fra.com

Comment créer une application .NET Windows Forms qui s'exécute uniquement dans la zone de notification?

Que dois-je faire pour exécuter une application Windows Forms dans la zone de notification?

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

202
xyz

La réponse de base de l’utilisation de NotifyIcon est correcte, mais, comme beaucoup de choses .NET, il existe une foule de subtilités pour le faire à droite . Le tutoriel mentionné par Brad donne un bon aperçu des bases, mais n’aborde aucune de celles-ci:

  • La fermeture de l'application à partir de la barre d'état système ferme-t-elle correctement les formulaires enfants ouverts?
  • L'application impose-t-elle qu'une seule instance d'elle-même puisse s'exécuter (applicable à la plupart des applications de plateau, mais pas à toutes)?
  • Comment ouvrir les fenêtres enfants WPF ainsi que les fenêtres enfants WinForm, si vous le souhaitez.
  • Comment prendre en charge les menus contextuels dynamiques.
  • Le NotifyIcon standard existe dans l’espace WinForms; puis-je faire une solution WPF pure? (Oui, vous pouvez!)

Je viens tout juste de publier un article sur Simple-Talk.com qui traite de ces points de manière plus détaillée, fournissant un cadre d’application de plateau que vous pouvez utiliser immédiatement, ainsi qu’un exemple complet d’application du monde réel pour tout afficher dans la pratique. Voir Création d'applications de plateau dans .NET: Un guide pratique , publié en novembre 2010.

151
Michael Sorens

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 fondamentalement la ligne Application.Run(new Form1()); dans Program.cs pour démarrer une classe qui hérite de ApplicationContext, et demandez au constructeur de 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();
    }
}
70
Fawzan Izy

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 (quelle qu'en soit la raison):

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 voulez effectuer une action sur un clic gauche, vous devez 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;
        }
    }
17
ChrisF

J'ai écrit une application sur la barre des tâches 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 comme un Sub Main, défini dans un module.
Créez ensuite les composants par programme: NotifyIcon et ContextMenu.
Assurez-vous d'inclure une MenuItem "Quitter" ou similaire.
Lier la ContextMenu à la NotifyIcon.
Invoque Application.Run().
Dans le gestionnaire d'événements pour Quit MenuItem assurez-vous d'appeler set NotifyIcon.Visible = False, puis Application.Exit(). Ajoutez ce dont vous avez besoin à la ContextMenu et gérez-le correctement :)

15
M.Turrini
  1. Créez une nouvelle application Windows avec l'assistant.
  2. Supprimez Form1 du code.
  3. Supprimez le code dans Program.cs à partir de Form1.
  4. Utilisez la classe NotifyIcon 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 clic de souris de NotifyIcon et différenciez les clics droit et gauche, définissez votre menu contextuel et affichez-le pour le bouton de votre choix (droite/gauche).
  7. Application.Run() pour maintenir l'application en cours d'exécution avec Application.Exit() pour quitter. Ou un bool bRunning = true; while(bRunning){Application.DoEvents(); Thread.Sleep(10);}. Puis définissez bRunning = false; pour quitter l'application.
10
Wolf5

L’application "Barre d'état système" est simplement une application classique permettant de gagner des formulaires. La seule différence est qu'elle crée une icône dans la zone de la barre d'état système de Windows. Pour créer une icône sys.tray, utilisez le composant NotifyIcon, vous pouvez le trouver dans Boîte à outils (Contrôles communs) et modifier ses propriétés: Icône, info-bulle. En outre, il vous permet de gérer les messages de clic de souris et de double-clic.

Et encore une chose, pour obtenir une apparence et une application de plateau standard. ajoutez des lignes de suivi sur votre événement principal:

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

Autant que je sache, vous devez toujours écrire l'application à l'aide d'un formulaire, mais ne contrôlez pas le formulaire et ne le rendez jamais visible. Utilisez NotifyIcon (un exemple MSDN que vous pouvez trouver ici ) pour écrire votre application.

6
Matthew Steeples

Voici comment je l'ai fait avec Visual Studio 201 , .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 dans la bande du menu contextuel, double-cliquez dessus pour obtenir les gestionnaires, par exemple, 'quitter' (double-clic) -> gestionnaire -> moi.Fermer ()
  4. Ajoutez une NotifyIcon dans le concepteur, définissez contextMenuStrip à celle que vous venez de créer, choisissez une icône (vous en trouverez dans le dossier VisualStudio sous "common7 ...").
  5. Définissez les propriétés du formulaire dans le concepteur: FormBorderStyle: none, ShowIcon: false, ShowInTaskbar: false, Opacité: 0%, WindowState: Minimized
  6. Add Me.Visible = false à la fin de Form1_Load, cela masquera l'icône lorsque vous utilisez Ctrl + Tab
  7. Courez et ajustez au besoin.
2
Evolved

Il s’agit d’un cadre très convivial pour Notification Area Application ... il suffit d’ajouter NotificationIcon pour baser le formulaire et modifier 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;
        }
    }
}
1

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.

0
YTerle