C++ Builder & System Tray Icon

peter1dav

ПОмещаю приложение в трей.
В качестве события возвращается только одного типа, если пытаещься что то сделать с иконкой.
Как с этим бороться?
.h формы:


...
#define TRAY_MESSAGE (WM_APP + 1)
#define ID_ICON_TRAY 1234
...
void __fastcall ApplicationEvents1Minimize(TObject *Sender);
void __fastcall ApplicationEvents1Restore(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TProjectMainForm(TComponent* Owner);
protected:
virtual void __fastcall OnIconMessage(TMessage& Message);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(TRAY_MESSAGE,TMessage,OnIconMessage);
END_MESSAGE_MAP(TComponent)


Класс для работы с треем:


//******************************************************************************
// Объявление класса SystemTrayIcon //
//******************************************************************************
class SystemTrayIcon
{
BOOL IconUsing;
NOTIFYICONDATA StructSystemIcon;
void SetTip(char* lpszTip);
public:
SystemTrayIcon;
~SystemTrayIcon;
BOOL SystemIconAdd(HWND hwnd, UINT uID, HICON hicon, char* lpszTip, UINT msg);
BOOL SystemIconDel;
BOOL SystemIconChange(HICON icon);
BOOL SystemIconChangeTip (char* lpszTip);
};
//******************************************************************************
// Конструктор класса SystemTrayIcon //
//******************************************************************************
SystemTrayIcon::SystemTrayIcon
{
IconUsing = FALSE;
memset(&StructSystemIcon, 0, sizeof(StructSystemIcon; StructSystemIcon.cbSize = sizeof(StructSystemIcon);
}
//******************************************************************************
// Деструктор класса SystemTrayIcon //
//******************************************************************************
SystemTrayIcon::~SystemTrayIcon
{
if(IconUsing)
SystemIconDel;
}
//******************************************************************************
// Добавление иконки в системный трей //
//******************************************************************************
BOOL SystemTrayIcon::SystemIconAdd (HWND hwnd, UINT uID, HICON hicon, char* lpszTip, UINT msg)
{
if (IconUsing)
return FALSE; //Иконка уже добавлена в трей
if (msg)
{
StructSystemIcon.cbSize = sizeof (NOTIFYICONDATA); // Указываем размер иконки
StructSystemIcon.hWnd = hwnd; // Указатель на окно от которого помещена иконка
StructSystemIcon.uID = uID; // Идентификатор иконки от данного окна (Любое число)
StructSystemIcon.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; // Что обрабатывать
StructSystemIcon.uCallbackMessage = msg; // Сообщение, которое обрабатывать при появлении мыши в трее в области значка
StructSystemIcon.hIcon = hicon; // Указатель на иконку
SetTip (lpszTip);
IconUsing = Shell_NotifyIcon (NIM_ADD, &StructSystemIcon);
if (IconUsing)
return TRUE;
};
IconUsing = FALSE;
return FALSE;
}
//******************************************************************************
// Установка комментария иконки в системном трее //
//******************************************************************************
void SystemTrayIcon::SetTip (char* lpszTip)
{
lstrcpyn(StructSystemIcon.szTip, lpszTip, sizeof(StructSystemIcon.szTip)/sizeof(StructSystemIcon.szTip[0];
}
//******************************************************************************
// Удаление иконки в системном трее //
//******************************************************************************
BOOL SystemTrayIcon::SystemIconDel
{
if (!IconUsing)
return FALSE; //Иконки нет в трее
IconUsing = !Shell_NotifyIcon(NIM_DELETE, &StructSystemIcon);
return IconUsing;
}
//******************************************************************************
// Изменение иконки в системном трее //
//******************************************************************************
BOOL SystemTrayIcon::SystemIconChange(HICON icon)
{
if (!IconUsing)
return FALSE;
HICON oldIcon = StructSystemIcon.hIcon;
StructSystemIcon.hIcon = icon;
StructSystemIcon.uFlags = NIF_ICON;
BOOL Result = Shell_NotifyIcon(NIM_MODIFY, &StructSystemIcon);
if (!Result)
StructSystemIcon.hIcon = oldIcon;
return Result;
}
//******************************************************************************
// Изменение подсказки к иконке в системном трее //
//******************************************************************************
BOOL SystemTrayIcon::SystemIconChangeTip (char* lpszTip)
{
if (!IconUsing)
return FALSE;
char OldlpszTip[sizeof (StructSystemIcon.szTip)];
lstrcpyn(StructSystemIcon.szTip, lpszTip, sizeof(StructSystemIcon.szTip)/sizeof(StructSystemIcon.szTip[0];
StructSystemIcon.uFlags = NIF_TIP;
BOOL Result = Shell_NotifyIcon(NIM_MODIFY, &StructSystemIcon);
if (!Result)
SetTip (OldlpszTip);
return Result;
}


При сворачивании формы:


void __fastcall TProjectMainForm::ApplicationEvents1Minimize(
TObject *Sender)
{
ClassSystemTrayIcon->SystemIconAdd(Handle, ID_ICON_TRAY, tray_icon->Handle, "Это моя иконка", TRAY_MESSAGE);
}


Обработчик:


void __fastcall TProjectMainForm::OnIconMessage(TMessage& Message)
{
if (Message.LParam = ХХХХХХХХХХ)
{.....}
else
{.....}


Что не так?
Нужно отследить двойно щелчек левой кнопки мыши..
И щелчек правой.

yuda

>В качестве события возвращается только одного типа,
>если пытаещься что то сделать с иконкой.
>Как с этим бороться?
Никак.


Hаиболее часто задаваемые вопросы по SystemTray.
Автор - Лев Серебряков (Lev Serebryakov
2:5030/219.fidonet или spb.runnet.ru
Версия 1.1
Часть 0. О чем.
Данный спиок вопросов и ответов на них содержит наиболее часто
задаваемые вопросы по использованию в своих программах для Microsoft
Windows 95 и Microsoft Windows NT 4.0 возможности оболочки, называемой
System Tray.
Часть 1. Комментарий.
Я хочу поблагадорить:
Andy Nicks (2:5031/16.Fidonet Kirill Pushkin (2:5030/219.19
а так же программистов петербургской фирмы "ПРОМТ", без этих людей
вряд ли я бы написал этот FAQ.
Любые пожелания, поправки, уточнения принимаются !
Распространение - свободное !
Часть 2. Версии.
19 января 1997 года - Версия 1.1, появились вопросы 11 и 12, исправлен
код в ответе на вопрос 8.
15 января 1997 года - Версия 1.0, впервые написан.
Часть 3. Содержание.
Q1 Что такое System Tray ?
Q2 Как мне перенести свою программу на Tray ?
Q3 Что такое иконка на Tray ?
Q4 Как добавить иконку на Tray ?
Q5 А как ее там изменить ?
Q6 А как удалить иконку с Tray ?
Q7 Как мне узнать о воздействии мыши на иконку, находящуюся на
Tray ?
Q8 Многие программы показывают Pop-Up меню при щелчке на их иконке,
как этого добиться ?
Q9 Многие программы минимизируясь, оказываются на Tray, как это
сделать ?
Q10 Всегда ли все вышесказанное будет работать ?
Q11 А есть ли официальная информация по System Tray ?
Q12 Как сделать пункт "по умолчанию" в Pop-Up меню выделенным ?
Часть 4. Собственно FAQ.
======================================================================
Q1: Что такое System Tray ? О чем идет речь ?
A1: Если Вы в операционной ситеме Windows'95 или Windows NT 4.0
пользуетесь оболочкой Explorer, то справа на TaskBar'е Вы
должны были видеть "углубленную" область в которой, обычно,
помещаются часы, переключатель клавиатуры, регулятор громкости и
некоторые другие утилиты. Они изображаются маленькими иконками и
для них существуют ToolTip'ы как для кнопок ToolBar'ов. При
щелчке или двойном щелчке по такой иконке программа обычно
выполняет действие по умолчанию, а при щелчке правой кнопкой
показывает Pop-Up меню.
Hа уровне оболочки System Tray это приложение, поддерживающее
окно, которое вы видите как "углубленную" область и некоторый
сервис для работы с этим окном.
======================================================================
Q2: Как мне перенести свою программу на Tray ?
A2: Это типичный вопрос программиста, пишущего какую-нибудь утилиту,
работающую в Background во время всей работы операционной системы
(в DOS такие утилиты делались TSR-программами). Hо вопрос
поставлен не корректно.
Обычно задавае этот вопрос программист имеет в виду примерно
следующее : "Моя программа работает [почти] все время в
минимизированном состоянии и очень жалко места под ее кнопку на
TaskBar'е. Как мне сделать, что бы при минимизации [старте|все
время] моя программа представлялась иконкой на System Tray'е и
отвечала на сообщения мыши от этой иконки ?"
Ответ на этот вопрос состоит из нескольких частей. Смотри
следующие вопросы и ответы на них.
======================================================================
Q3: Что такое иконка на System Tray ?
A3: Ответ на этот вопрос объясняет некорректность вопроса 2. Иконка
на Tray'е это просто картинка, а не окно какой-либо
программы (исследование системы с помощью Microsoft Spy++ for
Windows 95 показывает, что это не окно вообще). System Tray
отслеживает события мыши над иконкой и, в случае надобности,
показывает ToolTip для этой иконки. Так же он отсылает сообщения
о всех действиях мыши над иконкой окну, которое поместило иконку
на Tray.
Таким образом, нельзя поместить программу на Tray. Любая
программа может добавить стоько иконок на Tray, сколько ей
необходимо. При этом главное окно программы не обязано исчезать
или минимизироватся - примером может служить Microsoft Internet
Mail, помещающая иконку "конверт" на Tray в случае появления
новых писем.
======================================================================
Q4: Как добавить иконку на Tray ?
A4: Для работы с SystemTray существует всего одна функция. Вот ее
Си-прототип:
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage, // message identifier
PNOTIFYICONDATA pnid // pointer to structure
);
Эта функция описана в заголовочном файле Win32-SDK "shellapi.h",
включаемом в программу при включении "windows.h". Параметр
dwMessage может принимать одно из трех значений: NIM_ADD,
NIM_DELETE, NIM_MODIFY. Для добавления иконки он должен быть
установлен в NIM_ADD.
Параметр pnid имеет тип PNOTIFYDATA, который описан как:
typedef struct _NOTIFYICONDATA { // nid
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
char szTip[64];
} NOTIFYICONDATA, *PNOTIFYICONDATA;
Поля структуры NOTIFYICONDATA имеют следующий смысл:
cbSize - размер структуры, должен быть
sizeof(NOTIFYICONDATA).
hWnd - дескриптор окна, которое будет получать события
мыши над иконкой.
uID - уникальный идентификатор иконки. Идентификатор
должен быть уникален в пределах окна - обрабо-
тчика, передаваемого в hWnd.
uFlags - битовое поле, определяющее какое из следующих
полей несет действительную информацию.
Может быть одним из следующих значений: NIF_ICON,
NIF_MESSAGE, NIF_TIP или их OR-комбинацией.
uCallbackMessage - сообщение, передаваемое окну - обработчику при
событиях мыши. Желательно получать номер
сообщения вызовом RegisterWindowMessage
но допускаются и значения WM_USER+N, где N > 0.

peter1dav

Ну и что?
как добрать ся то до этого?

(UINT)lParam - содержит стандартное событие мыши, такое как WM_MOUSEMOVE или WM_LBUTTONDOWN.

к тому же ни слова про
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(TRAY_MESSAGE,TMessage,OnIconMessage);
END_MESSAGE_MAP(TComponent)

peter1dav

Между прочем проблема была всего лишь в этом

void __fastcall TProjectMainForm::OnIconMessage(TMessage& Message)
{
if (Message.LParam = ХХХХХХХХХХ)
{.....} else
{.....}

Знак равенства в С++ не "=" , "=="
Оставить комментарий
Имя или ник:
Комментарий: