среда, 26 августа 2009 г.

Windows.Forms: ложимся в трей

Не так давно встала передо мной задача - уложить программу на C# в трей. При разработке использовались стандартный Windows.Forms из .net 3.5, хотя со времен .net 2.0 он практически не изменился. На моё счастье все оказалось очень просто. Попытаюсь объяснить основные шаги.
1. Размещаем компонент NotifyIcon на форме. У меня в приложении одна форма главная, остальные даже в таскбаре не отображаются, на главную форму и положил. NotifyIcon находится в ToolBox, вместе со всеми контролами... Параметры этого NotifyIcon говорят сами за себя, правда если не задать иконку, то в трее вообще ничего не появится :)
2. Маленько изменяем поведение формы. Для программ размещающихся в трее принято при сворачивании убирать окно из таскбара, а при щелчке на иконке в таскбаре - разворачивать. Поэтому пишем следующие обработчики:
- для сворачивания формы (эвент Form.Resize)
  1. private void MainForm_Resize(object sender, EventArgs e)
  2. {
  3.     if (FormWindowState.Minimized == WindowState) Hide();
  4. }
* This source code was highlighted with Source Code Highlighter.
- и для клика по иконке в трее (эвент NotifyIcon.Click)
  1. private void notifyIcon_Click(object sender, EventArgs e)
  2. {
  3.     Show();
  4.     WindowState = FormWindowState.Normal;
  5. }
* This source code was highlighted with Source Code Highlighter.
3. Изменим поведение при попытке юзера закрыть окно по крестику. Для этого используем обработчик эвента Form.Closing:
  1. private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
  2. {
  3.  if (e.CloseReason == CloseReason.UserClosing)
  4.  {
  5.     e.Cancel = true;
  6.     Hide();
  7.     WindowState = FormWindowState.Minimized;
  8.  }
  9. }
* This source code was highlighted with Source Code Highlighter.
То есть, при щелчке по крестику наша форма просто свернется вниз, а завершение программы будет отменено. Правда на текущий момент эту программу можно только прибить из менеджера задач, что не очень хорошо. Поэтому:
4. Сделаем контекстное меню для иконки в трее. Компонент ContextMenuStrip размещаем на нашей форме, создаем в нем пункт "Выход" (и какие ещё необходимо). Затем скажем нашему NotifyIcon, что у него есть контекстное меню с помощью свойства NotifyIcon.ContextMenuStrip. А обработчик пункта "Выход" у нас будет таким:
  1. private void miClose_Click(object sender, EventArgs e)
  2. {            
  3.     Application.Exit();
  4. }
* This source code was highlighted with Source Code Highlighter.
То есть CloseReason в данном случае будет ApplicationExitCall.
Вот и всё. Приложение должно вполне успешно справляться со своей задачей "лежания" в трее.

1 комментарий: