Como posso criar um aplicativo .NET Windows Forms que seja executado somente na bandeja do sistema?

O que preciso fazer para executar um aplicativo do Windows Forms na bandeja do sistema?

Não é um aplicativo que pode minimizar para a bandeja, mas um que existe somente na bandeja, com nada além de um ícone, dica de ferramenta e menu “clique com o botão direito”.

A resposta básica do uso de um NotifyIcon está correta, mas, como muitas coisas .NET, há uma série de sutilezas envolvidas em fazer isso direito . O tutorial mencionado por Brad dá uma boa explicação dos fundamentos, mas não aborda nenhum destes:

  • O fechamento do aplicativo da bandeja do sistema fecha corretamente todos os formulários filhos abertos?
  • O aplicativo impõe que apenas uma instância de si pode ser executada (aplicável à maioria dos aplicativos de bandeja, embora não a todos)?
  • Como abrir janelas filho do WPF, bem como janelas filho do WinForms, se desejar.
  • Como suportar menus de contexto dynamics.
  • O padrão NotifyIcon existe no espaço do WinForms; posso fazer uma solução pura do WPF? (Sim você pode!)

Acabei de ter um artigo publicado no Simple-Talk.com que aborda esses pontos e muito mais detalhadamente, fornecendo uma estrutura de aplicativo de bandeja que você pode usar imediatamente, além de um aplicativo de exemplo completo e real para mostrar tudo na prática. Consulte Criando aplicativos de bandeja no .NET: um guia prático , publicado em novembro de 2010.

O artigo do projeto de código Criando um aplicativo Tasktray oferece uma explicação muito simples e um exemplo de criação de um aplicativo que só existe na bandeja do sistema.

Basicamente, altere o Application.Run(new Form1()); linha em Program.cs para iniciar uma class que herda de ApplicationContext , e ter o construtor para essa class inicializar um NotifyIcon

 static class Program { ///  /// The main entry point for the application. ///  [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(); } } 

Como diz mat1t – você precisa adicionar um NotifyIcon ao seu aplicativo e, em seguida, usar algo como o código a seguir para definir a dica de ferramenta e o menu de contexto:

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

Este código mostra o ícone somente na bandeja do sistema:

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

O seguinte será necessário se você tiver um formulário (por qualquer motivo):

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

O clique direito para obter o menu de contexto é tratado automaticamente, mas se você quiser fazer alguma ação clicando com o botão esquerdo, precisará adicionar um manipulador de cliques:

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

Eu escrevi um aplicativo traybar com o .NET 1.1 e não precisei de um formulário.
Primeiro de tudo, defina o object de boot do projeto como um Sub Main , definido em um módulo.
Em seguida, crie programaticamente os componentes: o NotifyIcon e o ContextMenu .
Certifique-se de include um MenuItem “Quit” ou similar.
Vincule o ContextMenu ao NotifyIcon .
Invoque Application.Run() .
No manipulador de events do Quit MenuItem certifique-se de chamar set NotifyIcon.Visible = False e Application.Exit() . Adicione o que você precisa ao ContextMenu e manipule corretamente 🙂

  1. Crie um novo aplicativo do Windows com o assistente.
  2. Exclua Form1 do código.
  3. Remova o código em Program.cs iniciando o Form1 .
  4. Use a class NotifyIcon para criar o ícone da bandeja do sistema (atribua um ícone a ele).
  5. Adicione um contextmenu a ele.
  6. Ou reaja ao NotifyIcon do NotifyIcon e diferencie entre clique direito e esquerdo, configurando o seu menu de contexto e mostrando para o qual o botão sempre (direita / esquerda) foi pressionado.
  7. Application.Run() para manter o aplicativo rodando com Application.Exit() para sair. Ou um while(bRunning){Application.DoEvents;Thread.Sleep(10);} . Em seguida, defina bRunning = false para sair do aplicativo.

O aplicativo “bandeja do sistema” é apenas um aplicativo regular de formulários ganhadores, a única diferença é que ele cria um ícone na área da bandeja do sistema do Windows. Para criar o ícone sys.tray use o componente NotifyIcon, você pode encontrá-lo na checkbox de ferramentas (controles comuns) e modificar suas propriedades: ícone, dica de ferramenta. Também permite que você manipule as mensagens de clique do mouse e clique duas vezes.

E mais uma coisa, a fim de conseguir olhar e sente ou app bandeja padrão. adicione linhas de acompanhamento no seu evento principal do formulário:

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

Tanto quanto eu sei que você ainda tem que escrever o aplicativo usando um formulário, mas não tem controles no formulário e nunca defini-lo visível. Use o NotifyIcon (um exemplo do MSDN que pode ser encontrado aqui ) para gravar seu aplicativo.

Aqui está como eu fiz isso com o Visual Studio 2010 , .NET 4

  1. Criar um aplicativo do Windows Forms, defina “Criar aplicativo de instância única” em propriedades
  2. Adicione um ContextMenuStrip
  3. Adicione algumas inputs à faixa do menu de contexto, clique duas vezes nelas para obter os manipuladores, por exemplo, ‘exit’ (clique duas vezes) -> handler -> me.Close ()
  4. Adicione um NotifyIcon, no designer set contextMenuStrip ao que você acabou de criar, escolha um ícone (você pode encontrar alguns na pasta do VisualStudio em ‘common7 …’)
  5. Definir propriedades para o formulário no designer: FormBorderStyle: none, ShowIcon: false, ShowInTaskbar: false, Opacidade: 0%, WindowState: Minimized
  6. Adicione Me.Visible = false no final de Form1_Load, isso ocultará o ícone ao usar Ctrl + Tab
  7. Corra e ajuste conforme necessário.

É um framework muito amigável para o Notification Area Application … basta adicionar o NotificationIcon para basear o formulário e alterar o código gerado automaticamente para o código abaixo:

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

Basta adicionar

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

ao seu object de formulário. Você verá apenas um ícone na bandeja do sistema.