Как создать приложение .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;
        }
    }

15

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


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;для выхода из приложения.

Программа прекращает выполнение, когда вы достигаете конца 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. Запустите и отрегулируйте по мере необходимости.

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;

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


Это помещает форму выше панели задач. Не то же самое. Вы пытаетесь ответить на другой пост?
— LarsTech

1
На панели задач нет значка, мы не видим форму. Визуально программа существует только в системном трее. Что значит выше ?
— YTerle

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

1
Если вы не заняты, пожалуйста, попробуйте написать и запустить его.
— YTerle
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.