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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

  • Создайте приложение Windows Forms, установите "Сделать одно экземплярное приложение" в свойствах
  • Добавить ContextMenuStrip
  • Добавьте некоторые записи в полосу контекстного меню, дважды щелкните их, чтобы получить обработчики, например, "exit" (двойной щелчок) → обработчик → me.Close()
  • Добавьте NotifyIcon в конструкторе set contextMenuStrip к тому, который вы только что создали, выберите значок (вы можете найти его в папке VisualStudio под "common7..." )
  • Установить свойства формы в конструкторе: FormBorderStyle: none, ShowIcon: false, ShowInTaskbar: false, Opacity: 0%, WindowState: Minimized
  • Добавить Me.Visible = false в конце Form1_Load, это скроет значок, когда используя Ctrl + Tab
  • Запустите и настройте по мере необходимости.

Ответ 9

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

Ответ 10

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

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

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