Comment puis-je faire un ordinateur Windows Forms .NET application qui ne fonctionne que dans le plateau de système?

StackOverflow https://stackoverflow.com/questions/995195

  •  13-09-2019
  •  | 
  •  

Question

Que dois-je faire pour faire un Windows Forms Exécuter l'application dans la zone de notification?

Pas une application qui peut réduire au minimum le plateau, mais qui existe uniquement dans le bac, avec rien de plus qu'une icône, infobulle, et le menu « clic droit ».

Était-ce utile?

La solution

La réponse de base à l'aide d'un NotifyIcon est correct, mais, comme beaucoup de choses .NET, il y a une foule de subtilités à le faire droit . Le tutoriel mentionné par Brad donne une bonne rendez-vous grâce à des bases mêmes, mais ne traite pas de ces derniers:

  • Est-ce que la fermeture de l'application de la barre d'état système correctement fermer toute forme d'enfant ouvert?
  • Est-ce que l'application appliquer qu'une seule instance de lui-même peut fonctionner (applicable à la plupart, mais pas tous, des applications de plateau)?
  • Comment ouvrir les fenêtres enfants WPF ainsi que les fenêtres enfants WinForms, si on le souhaite.
  • Comment soutenir les menus contextuels dynamiques.
  • La NotifyIcon norme existe dans l'espace WinForms; puis-je faire une solution pure WPF? (Oui, vous pouvez!)

Je viens d'avoir un article publié sur Simple-Talk.com qui aborde ces points et plus en détail, en fournissant un cadre d'application de plateau que vous pouvez mettre à utiliser immédiatement, en plus d'une application par exemple dans le monde réel complet, pour montrer tout en pratique. Voir Création Applications: bac .NET. Un guide pratique , publié Novembre 2010

Autres conseils

Le projet de code article Création d'une application donne une explication Icônes système très simple et l'exemple de créer une application qui n'existe jamais dans la zone de notification.

Changement Fondamentalement la ligne de Application.Run(new Form1()); à Program.cs pour commencer à la place une classe qui hérite de ApplicationContext, et ont le constructeur pour cette classe 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();
    }
}

Comme mat1t dit - 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 une forme (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 faire une action sur un clic gauche, vous devez ajouter un gestionnaire Cliquez sur:

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

J'ai écrit une application traybar avec .NET 1.1 et je ne l'ai pas besoin d'une forme.
, réglez d'abord l'objet de démarrage du projet en tant que sous Main, défini dans un module.
Ensuite, créez les composants: programme. NotifyIcon et la ContextMenu
Assurez-vous d'inclure un MenuItem « Quitter » ou similaire.
Lier le ContextMenu au NotifyIcon.
Invoquer Application.Run().
Dans le gestionnaire d'événements pour l'MenuItem Quitter veillez à appeler mettre NotifyIcon.Visible = False, puis Application.Exit(). Ajouter ce que vous devez la ContextMenu et de gérer correctement:)

  1. Créer une nouvelle application Windows avec l'assistant.
  2. Supprimer Form1 du code.
  3. Retirez le code Program.cs démarrage de l'Form1.
  4. Utilisez la classe NotifyIcon pour créer l'icône de votre barre d'état système (assigner une icône à elle).
  5. Ajouter un contextmenu à lui.
  6. Ou réagir aux NotifyIcon de mouseClick et Différencier entre droit et clic gauche, le réglage de votre contextmenu et le montrer pour lequel jamais le bouton (droite / gauche) a été pressé.
  7. Application.Run() de 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);}. Réglez ensuite bRunning = false; pour quitter l'application.

application « System tray » est juste une application régulière de formes de victoire, seule différence est qu'il crée une icône dans les fenêtres zone de barre d'état système. Afin de créer l'icône sys.tray utilisation NotifyIcon composant, vous pouvez le trouver dans Boîte à outils (contrôles communs), et de modifier ses propriétés: Icône, infobulle. En outre, il vous permet de gérer clic de souris et les messages double clic.

Et une chose, pour atteindre regarder et se sent ou une application standard de plateau. ajouter des lignes followinf sur votre principal événement show de formulaire:

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

Pour autant que je suis conscient que vous devez écrire encore l'application à l'aide d'un formulaire, mais ont aucun contrôle sur la forme et jamais mis visible. Utilisez le NotifyIcon (un échantillon de MSDN qui se trouve ) à écrire votre application.

Il est très sympathique cadre pour la notification d'application de la région ... il suffit d'ajouter NotificationIcon à la forme de base et modifier le code généré automatiquement au 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;
        }
    }
}

Ajoutez simplement

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

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

scroll top