Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

tray emulation (!!!)

18 views
Skip to first unread message

Victor Socolov

unread,
Jan 21, 2002, 4:42:43 PM1/21/02
to
Ясного, спокойного сна!

народ! очень срочно нужно!!!

моя программа является shell'ом. нужно эмулировать в ней трэй. то есть,
перехватывать каким-то образом Shell_NotifyIcon. подскажите хотя бы направление
раскопок... даже самые фантастичные. возможно, исходы какого-то шелла...

* Crossposted in SU.WINDOWS.PROG
* Crossposted in SU.WIN32.PROG


Сергей Ильич, работник сна

... pustota.graphics.ifmo.ru

Alex Mizrahi

unread,
Jan 24, 2002, 6:12:24 AM1/24/02
to

"Victor Socolov" wrote in message

> моя программа является shell'ом. нужно эмулировать в ней трэй. то есть,
> перехватывать каким-то образом Shell_NotifyIcon. подскажите хотя бы
направление
> раскопок... даже самые фантастичные. возможно, исходы какого-то шелла...

Дык Litestep open source, кажется.


Anatoliy Titov

unread,
Jan 24, 2002, 7:01:19 AM1/24/02
to
Hello, Victor!

In a msg of <Втоpник Янваpь 22 2030>, Victor Socolov wrote to All about "tray
emulation (!!!)" :

VS> народ! очень срочно нужно!!!
Hу, дык ;)
VS> моя программа является shell'ом. нужно эмулировать в ней трэй. то
VS> есть,
VS> перехватывать каким-то образом Shell_NotifyIcon. подскажите хотя бы
VS> направление раскопок... даже самые фантастичные. возможно, исходы
VS> какого-то шелла...

Hу, что ж, лови. Как раз сейчас чем-то похожим занимаюсь. Во что удалось
выяснить.
Вернёмся к нашим баранам, чтобы добавить иконку в трей, первый параметр
Shell_NotifyIcon додлжен быть NIM_ADD, второй - указатель на заполненную
структуру NOTIFYICONDATA. В результате вызова приложением этой функции, панель
задачь (класс Shell_TrayWnd) получает сообщение WM_COPYDATA, wParam содержит
дескриптор посылающего окна, lParam - указатель COPYDATASTRUCT. Разберём эту
структуру: первый член dwData содержит 1(видимо для внутреннего пользования),
второй - cbData - размер передаваемых данных в байтах (в данном случае 160) на
которые указывает третий член структуры lpData. у, а lpData, собственно,
содержит указатель, как выяснилось в результате муторных изысканий, на
следующую структуру:
struct {
DWORD dwID;
DWORD dwMessage; // Message value to send.
// This parameter can be one of these values:
// NIM_ADD Adds an icon to the status area.
// NIM_DELETE Deletes an icon from the status area.
// NIM_MODIFY Modifies an icon in the status area.
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags; // Array of flags that indicate which of
// the other members contain valid data.
// This member can be a combination of
// the following:
// NIF_ICON The hIcon member is valid.
// NIF_MESSAGE The uCallbackMessage member is valid.
// NIF_TIP The szTip member is valid.
UINT uCallbackMessage;
HICON hIcon;
WCHAR szTip[64];
};
Эта структура, как нетрудно заметить, почти идентична NOTIFYICONDATA за
исключением двух дополнительных членов в начале структуры: dwID и dwMessage.
Оба размером 4 байта.
Было замечено, что размер передаваемых данных 160 байт, а размер
NOTIFYICONDATA равен 152 байта (UNICODE, вся работа проводилась под Т 4.0
Сервер, в которой, как известно, реализована полная поддержка UNICOD'а).
Предположение, что Shell_Notifyicon передаёт указатель на NOTIFYICONDATA
оказалось почти верным. Только не на NOTIFYICONDATA, а на структуру описанную
выше, которая содержит в себе NOTIFYICONDATA плюс 8 дополнительных байт. азовём
эту структуру NOTIFYICONDATAEX.
Итак, в данном случае первый член dwID равен 34753423, dwMessage содержит
первый параметр Shell_Notifyicon (NIM_ADD, NIM_MODIFY или NIM_DELETE, т.е. 0, 1
или 2). Всё остальное идентично структуре, указатель на которую передаётся во
втором параметре вышеупомянитой функции.
Другими словами, когда приложение хочет добавить\изменить\удалить значок из
области состояния панели задачь, посредством вызова функции Shell_Notifyicon,
оно упаковывает структуру NOTIFYICONDATA в NOTIFYICONDATAEX в которой первый
член dwID равен 34753423 (видимо, как некоторый идентификатор), второй -
dwMessage равен NIM_ADD, NIM_MODIFY или NIM_DELETE, далее всё как и
NOTIFYICONDATA. Посылает панели задач (точнее окну класса Shell_TrayWnd)
сообщение WM_COPYDATA (функцией SendMessage), в котором третий член lpData
структуры COPYDATASTRUCT указывает на NOTIFYICONDATAEX.

Good luck! Anatoliy.

Max Pushkar

unread,
Jan 25, 2002, 9:49:58 AM1/25/02
to
En Taro Adun, Victor!

В Втоpник, 22 Янв 2002, 00:42, Victor Socolov wrote to All:

VS> моя программа является shell'ом. нужно эмулировать в ней трэй. то
VS> есть, перехватывать каким-то образом Shell_NotifyIcon. подскажите хотя
VS> бы направление раскопок... даже самые фантастичные. возможно, исходы
VS> какого-то шелла...
Hе знаю кто-как, а я бы начал с хуков... имхо преполезнейшая штука!

Пишите чаще, у Вас красивый почерк!

[Nightwish] [КИHО] [JRRT] [Babylon 5] [ASM] [Delphi] [C&C++] [Programming]
[Power\Speed\Doom\Gothic\Heavy\Dark\Death Metal]

Anatoliy Titov

unread,
Jan 25, 2002, 9:43:13 AM1/25/02
to
Hello, Victor!

In a msg of <Четвеpг Янваpь 24 2002>, Anatoliy Titov wrote to Victor Socolov
about "Re: tray emulation (!!!)" :

<Skip>
AT> дополнительных байт. азовём эту структуру NOTIFYICONDATAEX. Итак, в
AT> данном
AT> случае первый член dwID равен 34753423, dwMessage содержит первый параметр
^^^^^^^^шестнадцатиричное число 0х34753423
<Skip>

Good luck! Anatoliy.

0 new messages