Этот код вставьте в функцию инициализации, причем окно  вашего приложения уже должно быть создано, hWnd и hInstance должны быть определены. hWnd вы получаете при создании окна, а hInstance вам передают прямо в WinMain. Если у вас MFC-приложение, поставьте вместо них соответственно AfxGetMainWnd->m_hWnd и AfxGetApp->m_hInstance.

Ну вот, иконку мы вывели, и даже подсказка у нас выводится. Для своевременного удаления иконки в функцию, обрабатывающую выход из программы, поставьте примерно такую же конструкцию, но с NIM_DELETE: 

NOTIFYICONDATA nid;

memset(&nid, 0, sizeof(nid)); 

nid.cbSize = sizeof(nid);

nid.hWnd = hWnd;

nid.uID = ID_TRAYICON;

Shell_NotifyIcon(NIM_DELETE, &nid); 

(в структуре nid достаточно теперь определить только cbSize, hWnd и  uID).

Но иконка бесполезна, если она ничего не делает. Давайте добавим немного функциональности. Система посылает нам сообщение WM_TRAYNOTIFY каждый раз, когда с иконкой что-то происходит. Все, что мы должны сделать –  обработать это сообщение и отреагировать должным образом. 

Добавьте в программу обработчик события WM_TRAYNOTIFY. В этом сообщении wParam – это ID иконки, а lParam – код сообщения от мыши, например WM_RBUTTONDOWN. Если у вас не MFC-приложение, просто добавьте один case в функцию окна.  Если же вы имеете дело с MFC, то сделайте следующее: в класс главного окна(диалога) добавьте функцию  afxmsg void OnTrayNotify(WPARAM wParam, LPARAM lParam);

В карту сообщений класса добавьте следующую строку: ON_MESSAGE(WM_TRAYNOTIFY, OnTrayNotify)

Таким образом обрабатываются пользовательские сообщения. Эта строка свяжет наше сообщение WM_TRAYNOTIFY с функцией его обработки OnTrayNotify.

В этой функции проверяйте значение lParam и делайте то, что вам нужно, например, выводите меню. Как именно это делать – уже совсем другая история…

void CMyDlg::OnTrayNotify(WPARAM wParam, LPARAM lParam) {

 if (lParam==WM_LBUTTONDOWN) {

  ::SetForegroundWindow(m_hWnd); // активизируем наше приложение

  AfxMessageBox("Была нажата левая кнопка");

 } else if (lParam==WM_RBUTTONDOWN) {

  ::SetForegroundWindow(m_hWnd);

  AfxMessageBox("Была нажата правая кнопка");

 }

}

ВОПРОС-ОТВЕТ

Q. Не подскажете как в tray выводить текст, как например сделаны часы в windows?

Dmitriy

A1. Copy from ListSOFT от 18.07.2000

"…Если хочешь, чтобы рядом с системными часами располагалась надпись, например, твое имя, то в HKEY_CURRENT_USER\Control panel\ International\ в первые два параметра запиши его (не более 8 символов), а в третий запиши "HH:mm:ss tt". Кстати, если изменить формат времени таким способом, то строка, записанная в первые два параметра будет фигурировать во всех программах, запрашивающих время, например, в Outlook Express в графе Отправлено и Получено."

Grigori Zagarski

Я попробовал так сделать – не получилось. У меня в этом разделе вообще всего один параметр  – "Locale". Что-то автор напутал… Может, путь указан неправильно? Хоть результат и отрицательный, я решил все же на всякий случай опубликовать этот ответ – может, тут действительно дело во мне (я проверял в Windows 98SE), ведь на ListSOFT действительно была такая публикация. А может, кто и подскажет, в чем дело.

Перейти на страницу:

Похожие книги