Как я могу создать приложение .NET Windows Forms, которое запускается только на панели задач?

StackOverflow https://stackoverflow.com/questions/995195

  •  13-09-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

В основном изменить 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();
    }
}

Как говорит 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();

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

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

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

  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; чтобы выйти из приложения.

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

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

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

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

Вот как я это сделал с Визуальная студия 2010, .NET 4

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

Это очень дружелюбная среда для приложений области уведомлений...достаточно добавить 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;
        }
    }
}

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top