Как сделать, чтобы приложение Windows Forms .NET отображалось в виде иконки в трее? - PullRequest
19 голосов
/ 01 октября 2008

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

А как вы обрабатываете щелчки мышью по указанному значку?

Ответы [ 6 ]

20 голосов
/ 01 октября 2008

Сначала добавьте в форму элемент управления NotifyIcon . Затем подключите значок уведомления, чтобы сделать то, что вы хотите.

Если вы хотите, чтобы он скрывался в трее при сворачивании, попробуйте это.

Private Sub frmMain_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Resize
    If Me.WindowState = FormWindowState.Minimized Then
        Me.ShowInTaskbar = False
    Else
        Me.ShowInTaskbar = True
    End If
End Sub

Private Sub NotifyIcon1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.MouseClick
    Me.WindowState = FormWindowState.Normal
End Sub

Время от времени я буду использовать Balloon Text для уведомления пользователя - это делается так:

 Me.NotifyIcon1.ShowBalloonTip(3000, "This is a notification title!!", "This is notification text.", ToolTipIcon.Info)
6 голосов
/ 01 октября 2008

Вы можете добавить компонент NotifyIcon из панели инструментов в основную форму.

Здесь есть такие события, как MouseDoubleClick, которые можно использовать для обработки различных событий.

Редактировать. Необходимо убедиться, что для свойства Icon установлено допустимое значение .ico-файла, если вы хотите, чтобы оно правильно отображалось в системном окне.

2 голосов
/ 01 октября 2008

Хороший небольшой учебник по использованию класса NotifyIcon здесь: http://www.developer.com/net/csharp/article.php/3336751

0 голосов
/ 02 апреля 2018

Чтобы продлить Ответ Тома , я хотел бы сделать значок видимым, только если приложение свернуто.
Для этого установите Visible = False для NotifyIcon и используйте приведенный ниже код.

У меня также есть код ниже, чтобы скрыть значок во время закрытия, чтобы предотвратить надоедливые ghost значки в трее, которые сохраняются после закрытия приложения.

Private Sub Form_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Resize
    If Me.WindowState = FormWindowState.Minimized Then
        Hide()
        NotifyIcon1.Visible = True
        NotifyIcon1.ShowBalloonTip(3000, NotifyIcon1.Text, "Minimized to tray", ToolTipIcon.Info)
    End If
End Sub

Private Sub NotifyIcon1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.MouseClick
    Show()
    Me.WindowState = FormWindowState.Normal
    Me.Activate()
    NotifyIcon1.Visible = False
End Sub

Private Sub Form_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    NotifyIcon1.Visible = False
    Dim index As Integer
    While index < My.Application.OpenForms.Count
        If My.Application.OpenForms(index) IsNot Me Then
            My.Application.OpenForms(index).Close()
        End If
        index += 1
    End While
End Sub

Если вы хотите добавить контекстное меню:

VB.NET: как создать контекстное меню для иконки в трее

За статью (с модами для контекста):

Настройка формы для размещения контекстного меню иконки в трее

  • В свойствах установите для FormBorderStyle значение Нет.
  • Установите для ShowInTaskbar значение False (поскольку мы не хотим, чтобы значок появлялся на панели задач при щелчке правой кнопкой мыши на значке в трее!).
  • Установить для StartPosition значение Manual.
  • Установите для TopMost значение True.
  • Добавьте ContextMenuStrip в новую форму и назовите ее как хотите.
  • Добавление элементов в ContextMenuStrip (для этого примера просто добавьте один элемент с именем «Выход»).

Код формы будет выглядеть следующим образом:

Private Sub Form_Deactivate(sender As Object, e As EventArgs) Handles Me.Deactivate
    Me.Close()
End Sub

Private Sub Form_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ContextMenuStrip1.Show(Cursor.Position)
    Me.Left = ContextMenuStrip1.Left + 1
    Me.Top = ContextMenuStrip1.Top + 1
End Sub

Private Sub ExitToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ExitToolStripMenuItem.Click
    MainForm.NotifyIcon1.Visible = False
    End
End Sub

Затем я изменяю событие мыши notifyicon на это (TrayIconMenuForm - это имя моей Формы для предоставления контекстного меню):

Private Sub NotifyIcon1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.MouseClick
    Select Case e.Button
        Case Windows.Forms.MouseButtons.Left
            Show()
            Me.WindowState = FormWindowState.Normal
            Me.Activate()
            NotifyIcon1.Visible = False
        Case Windows.Forms.MouseButtons.Right
            TrayIconMenuForm.Show() 'Shows the Form that is the parent of "traymenu"
            TrayIconMenuForm.Activate() 'Set the Form to "Active", that means that that will be the "selected" window
            TrayIconMenuForm.Width = 1 'Set the Form width to 1 pixel, that is needed because later we will set it behind the "traymenu"
            TrayIconMenuForm.Height = 1 'Set the Form Height to 1 pixel, for the same reason as above
        Case Else
            'Do nothing
    End Select
End Sub
0 голосов
/ 29 декабря 2008

Показывает и обрабатывает все комбинации щелчков мыши для NotifyIcon

.

Подробнее здесь: https://archive.codeplex.com/?p=notifyicon

0 голосов
/ 01 октября 2008

Добавьте NotifyIcon компонент к вашей форме. И использовать его события для обработки щелчков мыши.

...