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



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



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

720   10  

10 ответов:

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

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

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

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

в принципе изменить Application.Run(new Form1()); в строке Program.cs чтобы вместо этого запустить класс, который наследует от ApplicationContext, и пусть конструктор для этого класса инициализирует a 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;
        }
    }

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

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

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

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

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

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

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

  1. создание приложений на основе форм Windows, установить сделать один экземпляр приложения в свойства
  2. добавить ContextMenuStrip
  3. добавьте некоторые записи в полосу контекстного меню, дважды щелкните по ним, чтобы получить обработчики, например, "выход" (двойной щелчок) -> обработчик -> me.Закрыть()
  4. добавьте NotifyIcon, в конструктор set contextMenuStrip к тому, который вы только что создали, выберите значок (вы можете найти его в папке VisualStudio в разделе 'common7...')
  5. задать свойства формы в конструкторе: FormBorderStyle: none, ShowIcon: false, ShowInTaskbar:false, непрозрачность:0%, WindowState: Minimized
  6. Добавить Меня.Visible=false в конце Form1_Load, это скроет значок, когда используя Ctrl + Tab
  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;

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

Comments

    Ничего не найдено.