Как создать приложение .NET Windows Forms, которое работает только в системном трее?

217

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

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

хуг
источник
9
В большинстве ответов чего-то не хватает - не забудьте установить icon.Visible = false, затем Dispose()значок при выходе из приложения. В противном случае вы все равно увидите значок после выхода из программы. Пару раз протестировав его, вы больше не будете знать, какой значок настоящий.
Томаш Гандор
Если вам нужен более современный подход WPF - вы можете попробовать это: codeproject.com/Articles/36788/…
Мюррей Фоккрофт

Ответы:

86

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

В основном измените 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();
    }
}
Фаззан Изы
источник
13
Это отличная отправная точка. Обратите внимание, что «AppIcon» должен быть именем ресурса, который вы добавляете с помощью «Project -> Properties -> Resources -> Add Resource», а затем перекомпилируете проект.
Лавамантис,
1
Я сделал properties..resources..add resource..icon .. перекомпилирован, все еще получаю «Ошибка CS0103 Имя« Ресурсы »не существует в текущем контексте»
barlop
@ barlop Я должен был написать это так: Properites.Resources.AppIcon
Симон Перепелица
@SimonPerepelitsa спасибо, я не уверен, что я делал в своих экспериментах, я хотел прокомментировать то, что работало, но я, должно быть, забыл некоторые вещи, которые я сделал, которые работали. Но в конечном итоге я использовал метод перетаскивания значка уведомления из палитры вещей, которые можно перетаскивать. Затем нажмите на нее в форме, нажав маленькую стрелочку, которая вызывает меню, чтобы выбрать значок для него!
Бароп
18

Как говорит 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;
        }
    }
ChrisF
источник
15

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

M.Turrini
источник
11
  1. Создайте новое приложение Windows с помощью мастера.
  2. Удалить Form1из кода.
  3. Удалите код в Program.cs при запуске Form1.
  4. Используйте NotifyIconкласс, чтобы создать значок в системном трее (назначьте ему значок).
  5. Добавьте к нему контекстное меню.
  6. Или NotifyIconреагируйте на щелчок мышью и различайте правый и левый щелчки, устанавливая контекстное меню и показывая, для какой кнопки (правая / левая) была нажата.
  7. Application.Run()чтобы приложение работало, Application.Exit()чтобы выйти. Или bool bRunning = true; while(bRunning){Application.DoEvents(); Thread.Sleep(10);}. Затем установите bRunning = false;для выхода из приложения.
Wolf5
источник
Программа прекращает выполнение, когда вы достигаете конца Main и не имеет потока пользовательского интерфейса. Как вы заботитесь о том, что это ваше решение? Если вы решили эти проблемы, то вы получите мой голос :)
Мэтью Стиплс
Вы получите мой голос. Может быть, просто упомянуть, что вам все еще нужно вызвать Application.Run без каких-либо параметров?
Обновлен альтернативой App.Run.
Wolf5
Я знаю, что thread.sleep является излишним, но если у вас есть лучшая альтернатива цикла «сна» для Application.Run,
опубликуйте
Thread.Sleep - плохая идея: в конечном итоге вы будете использовать больше ресурсов процессора и батареи, чем если бы вы просто использовали Application.Run, как вы и предполагали.
Sneftel
9

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

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

private void MainForm_Shown(object sender, EventArgs e)
{
    WindowState = FormWindowState.Minimized;
    Hide();
} 
Гордон Фриман
источник
7

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

Мэтью Стиплз
источник
1
Не совсем. Ваши формы могут содержать элементы управления, но по умолчанию они должны быть скрыты.
Rune Grimstad
5
Вам не нужна никакая форма. После мастера создания нового приложения Windows просто удалите форму Form1 и удалите код, открывающий ее. Вы можете написать все это из Program.cs с NotifyIcon и ContextMenu на нем. Больше ничего не требуется.
Wolf5
1
Я знаю, что он может содержать элементы управления, но ОП не хочет этого
Мэтью Стиплз
2

Вот как я это сделал с 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. Запустите и отрегулируйте по мере необходимости.
Evolved
источник
2

Это очень дружественный фреймворк для приложения области уведомлений ... достаточно добавить 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;
        }
    }
}
Себастьян Ксавери Вишневецки
источник
-2

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

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

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

YTerle
источник
Это помещает форму выше панели задач. Не то же самое. Вы пытаетесь ответить на другой пост?
LarsTech
1
На панели задач нет значка, мы не видим форму. Визуально программа существует только в системном трее. Что значит выше ?
YTerle
Ваш ответ не содержит контекста. Вы используете класс NotifyIcon? Если нет, ваша форма просто сворачивается в нижний левый угол над панелью задач.
LarsTech
1
Если вы не заняты, пожалуйста, попробуйте написать и запустить его.
YTerle