Свернуть приложение в системный трей

У меня есть приложение форм Windows, работающее на С# и Visual Studio 2010.

Как я могу свести к минимуму мое приложение в системном трее (не панели задач), а затем вернуть его при двойном щелчке на панели задач? Есть идеи? также, как я могу сделать какое-то меню в значке в системном трее, а когда я нажму правой кнопкой мыши, он отобразит меню, такое как "Вход", "Отключить", "Подключить", что-то в этом роде. Кроме того, существуют ли какие-либо методы, показывающие, как всплывающий из системного лотка шар?

PS: Я уже добавил notifyIcon, но я не знаю, как его использовать.

Ответ 1

Обрабатывать формы Изменение размера. В этом обработчике вы переопределяете базовую функциональность события Resize, чтобы минимизировать форму в системном трее, а не на панели задач. Это можно сделать, выполняя следующий в ваших формах Обработчик события Resize: проверьте, Форма Свойство WindowState имеет значение FormWindowState.Minimized. Если да, скройте вашу форму, включите объект NotifyIcon и покажите воздушный шар, который показывает некоторую информацию. Как только WindowState станет FormWindowState.Normal, отключите объект NotifyIcon, установив его Видимое свойство - false. Теперь вы хотите, чтобы окно снова появлялось, когда дважды щелкните объект NotifyIcon на панели задач. Для этого, обработайте событие NotifyIcons MouseDoubleClick. Здесь вы показываете формы с помощью метода Show().

private void frmMain_Resize(object sender, EventArgs e)
{
    if (FormWindowState.Minimized == this.WindowState)
    {
       mynotifyicon.Visible = true;
       mynotifyicon.ShowBalloonTip(500);
       this.Hide();
    }

    else if (FormWindowState.Normal == this.WindowState)
    {
       mynotifyicon.Visible = false;
    }
}

Ответ 2

Я нашел это, чтобы выполнить все решение. Ответ выше не удаляет окно из панели задач.

private void ImportStatusForm_Resize(object sender, EventArgs e)
{
    if (this.WindowState == FormWindowState.Minimized)
    {
        notifyIcon.Visible = true;
        notifyIcon.ShowBalloonTip(3000);
        this.ShowInTaskbar = false;
    }
}

private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
    this.WindowState = FormWindowState.Normal;
    this.ShowInTaskbar = true;
    notifyIcon.Visible = false;
}

Также полезно установить следующие свойства значка значка с помощью конструктора форм.

this.notifyIcon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info; //Shows the info icon so the user doesn't thing there is an error.
this.notifyIcon.BalloonTipText = "[Balloon Text when Minimized]";
this.notifyIcon.BalloonTipTitle = "[Balloon Title when Minimized]";
this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon"))); //The tray icon to use
this.notifyIcon.Text = "[Message shown when hovering over tray icon]";

Ответ 3

не забудьте добавить файл значка в ваш notifyIcon или он не появится в лотке.

Ответ 4

Я бы пошел с

private void Form1_Resize(object sender, EventArgs e)
{
     if (FormWindowState.Minimized == this.WindowState)
     {
          notifyIcon1.Visible = true;
          notifyIcon1.ShowBalloonTip(500);
          this.Hide();    
     }
     else if (FormWindowState.Normal == this.WindowState)
     {
          notifyIcon1.Visible = false;
     }
}

private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
{
     this.Show();
     this.WindowState = FormWindowState.Normal;
}

Ответ 5

попробуйте это

 private void Form1_Load(object sender, EventArgs e)
    {
        notifyIcon1.BalloonTipText = "Application Minimized.";
        notifyIcon1.BalloonTipTitle = "test";
    }

    private void Form1_Resize(object sender, EventArgs e)
    {
        if (WindowState == FormWindowState.Minimized)
        {
            ShowInTaskbar = false;
            notifyIcon1.Visible = true;
            notifyIcon1.ShowBalloonTip(1000);
        }
    }

    private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        ShowInTaskbar = true;
        notifyIcon1.Visible = false;
        WindowState = FormWindowState.Normal;
    }

Ответ 6

Это метод, который я использую в своих приложениях, он довольно простой и понятный, но я рад дать более подробную информацию в ответ на ваши комментарии.

    public Form1()
    {
        InitializeComponent();

        // When window state changed, trigger state update.
        this.Resize += SetMinimizeState;

        // When tray icon clicked, trigger window state change.       
        systemTrayIcon.Click += ToggleMinimizeState;
    }      

    // Toggle state between Normal and Minimized.
    private void ToggleMinimizeState(object sender, EventArgs e)
    {    
        bool isMinimized = this.WindowState == FormWindowState.Minimized;
        this.WindowState = (isMinimized) ? FormWindowState.Normal : FormWindowState.Minimized;
    }

    // Show/Hide window and tray icon to match window state.
    private void SetMinimizeState(object sender, EventArgs e)
    {    
        bool isMinimized = this.WindowState == FormWindowState.Minimized;

        this.ShowInTaskbar = !isMinimized;           
        systemTrayIcon.Visible = isMinimized;
        if (isMinimized) systemTrayIcon.ShowBalloonTip(500, "Application", "Application minimized to tray.", ToolTipIcon.Info);
    }

Ответ 7

При щелчке по изображению в системном лотке вы можете проверить, является ли кадр видимым, и тогда вы должны установить Visible = true или false

Ответ 8

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