Как создать приложение .NET Windows Forms, которое работает только в системном трее? - PullRequest
201 голосов
/ 15 июня 2009

Что мне нужно сделать, чтобы приложение Windows Forms работало в системном трее?

Не приложение, которое может сворачивать в трей, а существующее только в трей, с не чем иным, как пиктограммой, подсказкой и меню «правой кнопкой мыши».

Ответы [ 10 ]

149 голосов
/ 05 ноября 2010

Основной ответ на использование NotifyIcon правильный, но, как и во многих других случаях .NET, в его выполнении есть множество тонкостей right . Учебное пособие, упомянутое Брэдом, дает хорошее представление об основах, но не затрагивает ни одного из них:

  • Правильно ли закрывает приложение из системного трея все открытые дочерние формы?
  • Обеспечивает ли приложение запуск только одного его экземпляра (применимо к большинству, хотя и не ко всем приложениям в трее)?
  • Как открыть дочерние окна WPF, а также дочерние окна WinForms, если это необходимо.
  • Как поддерживать динамические контекстные меню.
  • Стандартный NotifyIcon существует в пространстве WinForms; я могу сделать чистое решение WPF? (Да, вы можете!)

У меня только что была опубликована статья на Simple-Talk.com, в которой подробно рассматриваются эти моменты и более подробно описывается среда приложения лотка, которую вы можете сразу использовать, а также полнофункциональный пример приложения, демонстрирующий все на практике. См. Создание приложений для лотков в .NET: Практическое руководство , опубликовано в ноябре 2010 г.

68 голосов
/ 20 апреля 2012

Статья проекта кода Создание приложения в области задач дает очень простое объяснение и пример создания приложения, которое когда-либо существовало только в системном трее.

В основном измените строку Application.Run(new Form1()); в Program.cs, чтобы вместо этого запустить класс, который наследуется от ApplicationContext, и чтобы конструктор для этого класса инициализировал 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();
    }
}
17 голосов
/ 15 июня 2009

Как говорит mat1t - вам нужно добавить NotifyIcon в ваше приложение, а затем использовать что-то вроде следующего кода для установки всплывающей подсказки и контекстного меню:

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

Этот код показывает значок только на панели задач:

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

Если у вас есть форма (по какой-либо причине), вам потребуется следующее:

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

Правый щелчок, чтобы получить контекстное меню, обрабатывается автоматически, но если вы хотите выполнить какое-либо действие по левому щелчку, вам нужно добавить обработчик 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;
        }
    }
15 голосов
/ 15 июня 2009

Я написал приложение на панели задач с .NET 1.1, и мне не нужна форма.
Прежде всего, установите объект запуска проекта как Sub Main, определенный в модуле.
Затем программно создайте компоненты: NotifyIcon и ContextMenu.
Обязательно укажите MenuItem «Выход» или аналогичный.
Свяжите ContextMenu с NotifyIcon.
Вызвать Application.Run().
В обработчике события Quit MenuItem обязательно вызовите set NotifyIcon.Visible = False, затем Application.Exit(). Добавьте то, что вам нужно, к ContextMenu и обработайте правильно:)

10 голосов
/ 15 июня 2009
  1. Создайте новое приложение Windows с помощью мастера.
  2. Удалить Form1 из кода.
  3. Удалите код из Program.cs при запуске Form1.
  4. Используйте класс NotifyIcon, чтобы создать значок на панели задач (назначьте ему значок).
  5. Добавить контекстное меню к нему.
  6. Или реагируйте на щелчок мышью NotifyIcon и различайте правый и левый щелчки, устанавливая контекстное меню и показывая его, для которого когда-либо нажималась кнопка (вправо / влево).
  7. Application.Run(), чтобы приложение продолжало работать с Application.Exit() для выхода. Или while(bRunning){Application.DoEvents;Thread.Sleep(10);}. Затем установите bRunning = false для выхода из приложения.
8 голосов
/ 15 июня 2009

Приложение «Системный трей» - это обычное приложение для создания выигрышных форм, с той лишь разницей, что оно создает значок в области панели задач Windows. Чтобы создать значок sys.tray, используйте компонент NotifyIcon, вы можете найти его в Панели инструментов (Общие элементы управления) и изменить его свойства: Значок, подсказка. Также он позволяет обрабатывать сообщения о щелчках мышью и двойном щелчке.

И еще одна вещь, для достижения внешнего вида или ощущения или стандартное приложение лотка. добавьте следующие строки в ваше главное событие шоу формы:

private void MainForm_Shown(object sender, EventArgs e)
{
    WindowState = FormWindowState.Minimized;
    Hide();
} 
6 голосов
/ 15 июня 2009

Насколько я знаю, вы все равно должны писать приложение, используя форму, но не иметь элементов управления в форме и никогда не устанавливать его видимым. Используйте NotifyIcon (образец MSDN которого можно найти здесь ), чтобы написать ваше приложение.

2 голосов
/ 26 июля 2011

Вот как я это сделал с Visual Studio 2010 , .NET 4

  1. Создайте приложение Windows Forms, задайте «Создать приложение с одним экземпляром» в свойствах
  2. Добавить ContextMenuStrip
  3. Добавьте некоторые записи в полосу контекстного меню, дважды щелкните по ним, чтобы получить обработчики, например, 'exit' (двойной щелчок) -> handler -> me.Close ()
  4. Добавьте NotifyIcon, в конструкторе установите contextMenuStrip к тому, который вы только что создали, выберите значок (вы можете найти его в папке VisualStudio в 'common7 ...')
  5. Установить свойства для формы в конструкторе: FormBorderStyle: нет, ShowIcon: false, ShowInTaskbar: false, непрозрачность: 0%, WindowState: свернуто
  6. Добавить Me.Visible = false в конце Form1_Load, это будет скрывать значок, когда используя Ctrl + Tab
  7. Запустите и отрегулируйте при необходимости.
1 голос
/ 18 сентября 2014

Это очень дружественный фреймворк для приложения области уведомлений ... достаточно добавить NotificationIcon в базовую форму и изменить автоматически сгенерированный код на код ниже:

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;
        }
    }
}
0 голосов
/ 01 июля 2015

Просто добавьте

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

к вашему объекту формы. Вы увидите только значок в системном трее.

...