Як я можу зробити .NET Windows Forms додаток, який працює лише в системному треї?


216

Що мені потрібно зробити, щоб програма Windows Forms запустилася в системному треї?

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



9
У більшості відповідей чогось не вистачає - не забудьте встановити icon.Visible = false, а потім Dispose()піктограму, коли виходите зі своєї заявки. Інакше піктограму ви побачите після завершення роботи програми. Випробувавши його кілька разів, ви більше не будете знати, який значок справжній.
Томаш Гандор

Відповіді:


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", а потім перекомпілюйте проект.
Lavamantis

1
Я зробив властивості..resources..add resource..icon .. перекомпілював, все одно отримаю "Помилка CS0103 Назва" Resources "не існує в поточному контексті"
barlop

@barlop Мені довелося написати це так: Properites.Resources.AppIcon
Simon

@SimonPerepelitsa спасибі, я не впевнений, що я робив в своїх експериментах, я мав на увазі прокоментувати те, що спрацювало, але, мабуть, я забув деякі речі, які я робив, що працював. Зрештою, метод, який я використав, - перетягування піктограми notificaton з палітри речей, на які можна перетягнути. Потім клацніть по ньому на бланку, натисніть на стрілку, яка відображає меню, щоб вибрати значок для неї!
барлоп

17

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

15

Я написав додаток для лотка з .NET 1.1, і мені не потрібна форма.
Перш за все, встановіть об'єкт запуску проекту як Sub Main, визначений у модулі.
Потім програмно створіть компоненти: NotifyIconі ContextMenu.
Обов’язково додайте MenuItem"Вийти" або подібне.
Прив’язати ContextMenuдо NotifyIcon.
Викликати Application.Run(). Тоді
в обробці подій для Quit MenuItemобов'язково подзвоніть набір . Додайте те, що вам потрібно, і правильно поводьтеся :)NotifyIcon.Visible = FalseApplication.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 виконайте це повідомлення :)
Wolf5

Thread.Sleep - це погана ідея: ви в кінцевому підсумку використовуватимете більше процесора та акумулятора, ніж якщо б ви щойно зробили Application.Run, як вам призначено.
Sneftel

8

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

І ще одне, щоб досягти зовнішності та вигляду або стандартного додатка для лотка. додайте наступні рядки у головну форму показу події:

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

6

Наскільки мені відомо, ви все ще повинні писати заявку за допомогою форми, але не мати контролю над формою і ніколи не встановлювати її видимою. Використовуйте NotifyIcon (зразок MSDN, який можна знайти тут ), щоб написати свою заявку.


1
Не зовсім. Ваші форми можуть містити елементи керування, але вони повинні бути прихованими за замовчуванням.
Руна Грімстад

5
Вам не потрібна жодна форма. Після нового майстра створення віконних програм просто видаліть Form1 і видаліть код, відкривши його. Ви можете написати це все з Program.cs з NotifyIcon та ContextMenu на ньому. Більше нічого не потрібно.
Wolf5

1
Я знаю, що він може містити елементи керування, але ОП не хоче, щоб це
Меттью Стіплз

2

Ось як я це зробив з Visual Studio 2010 , .NET 4

  1. Створіть додаток Windows Forms, встановіть у властивостях "Зробити додаток для одного примірника"
  2. Додати ContextMenuStrip
  3. Додайте деякі записи до смужки контекстного меню, двічі клацніть на них, щоб отримати обробники, наприклад, 'вихід' (подвійний клацання) -> обробник -> me.Close ()
  4. Додайте NotifyIcon у дизайнерському наборі контексту MenuStrip до створеного вами, виберіть піктограму (їх можна знайти в папці 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.