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".
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:
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.
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();
}
}
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;
}
}
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 :)
Form1
du code.Form1
.NotifyIcon
pour créer l'icône de la barre d'état système (attribuez-lui une icône).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).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.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();
}
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.
Voici comment je l'ai fait avec Visual Studio 201 , .NET 4
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;
}
}
}
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.