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


114

У меня есть приложение Windows Forms на C # и Visual Studio 2010.

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

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


Здесь вы можете скачать отличный пример кода simple-talk.com/dotnet/.net-framework/…
Разработчик

Вам нужно обязательно войти в файл Designer.cs формы и «зарегистрировать» обработчик событий, иначе ни один из них не будет работать (я не мог понять). Вы можете сделать это, добавив что-то вроде этого: this.Resize + = new System.EventHandler (this.ManagementForm_Resize);
Брэд,

Ответы:


149

Обработайте событие Resize формы. В этом обработчике вы переопределяете базовые функции события Resize, чтобы свести форму к панели задач, а не на панели задач. Это можно сделать, выполнив в обработчике события Resize вашей формы следующее: Проверьте, установлено ли свойство WindowState формы на FormWindowState.Minimized. Если да, скройте форму, включите объект NotifyIcon и покажите всплывающую подсказку, которая показывает некоторую информацию. Как только WindowState станет FormWindowState.Normal, отключите объект NotifyIcon, установив для его свойства Visible значение false. Теперь вы хотите, чтобы окно снова появлялось при двойном щелчке по объекту NotifyIcon на панели задач. Для этого обработайте событие MouseDoubleClick NotifyIcon. Здесь вы показываете форму с помощью метода 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;
    }
}

5
вы можете изменить свойство Form.FormBorderStyle msdn.microsoft.com/en-us/library/…
CD ..

TNX! это сработало .. также есть идея отключить эти кнопки свернуть, закрыть, развернуть вверху справа? tnx
WantIt 02


tnx тоже сработало! Кроме того, когда я дважды щелкаю значок на панели задач, окно не отображается поверх других приложений, мне нужно приложить усилия, щелкнув окно на панели задач, чтобы оно появилось. Как с этим справиться? tnx so much
WantIt


69

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

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 think 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]";

7
Вы пропали this.Show();раньшеthis.WindowState = FormWindowState.Normal;
developerwjk

1
Опечатка в словах «пользователь ничего не делает». ;)
Эндрю

1
@developerwjk, это не пропало, потому что он не звонит Hide(). Но проблема с этим подходом заключается в том, что окно по-прежнему появляется при нажатии Alt-Tab. Я предпочитаю звонить, Hide()и тогда вам вообще не нужно пользоваться ShowInTaskbarнедвижимостью.
Эндрю

@Andrew У меня проблемы при использовании Show()и Hide(); после скрытия, отображения и последующего скрытия он больше не отображается.
newbieguy

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

17

Я бы пошел с

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

17

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


самая нужная часть в теме. Не могли бы вы добавить немного дополнительной информации, как заставить его использовать значок по умолчанию?
T.Todua

12

попробуй это

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

1
Если вы просто скроетесь с панели задач вместо вызова this.Hide(), окно все равно появится при нажатии Alt-Tab.
Эндрю

3

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

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

2
У этого и других решений есть одна проблема: если форма скрыта под другими окнами, пользователь, скорее всего, не захочет сворачивать ее при нажатии на значок. Вместо этого он должен быть сосредоточен. См. Мой вопрос здесь: stackoverflow.com/questions/36797442/…
maf-soft

1

Щелкнув изображение на панели задач, вы можете проверить, видна ли рамка, а затем вам нужно установить Visible = true или false.


1

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.