Как получить иконку рабочего стола или иконку какой-нить программы из SystemTray? Идея состоит в перемещении(скрытии) иконок по рабочему столу или скрытии иконки не моей программы из трея.
Здравствуйте Azrael, Вы писали:
A>Как получить иконку рабочего стола или иконку какой-нить программы из SystemTray? Идея состоит в перемещении(скрытии) иконок по рабочему столу или скрытии иконки не моей программы из трея.
Про получении иконки с рабочеко стола писал Рихтер в своей "Advanced Windows", а вот на счет скрытии иконок из трея...
Берем Spy++ и смотрим на SysTray и видим, что класс окна SysTray (Shell_TrayWnd->TrayNotifyWnd) есть ToolbatWindow32...
Пример, удаляющий первую иконку из трея (для простоты все проверки выброшены):
void
DeleteFirstIconInTray (
void
)
{
// Находим окно трея
//
HWND hTrayWnd = FindWindow (
_T("Shell_TrayWnd"), // класс окна трея
_T("")); // заголовок
// Находим child-а с классом ToolbarWindow32
//
HWND hToolbar = NULL;
EnumChildWindows (
hTrayWnd, // окно трея
FindToolbarProc, // процедура перечисления
(LPARAM) &hToolbar); // переменная для сохранения результата
// Удаляем первую иконку
//
SendMessage (
hToolbar, // окно тулбара (трея с иконками)
TB_DELETEBUTTON, // "удалить кнопку"
(WPARAM) 0, // номер кнопки
(LPARAM) 0); // всегда 0
} // DeleteFirstIconInTray
а вот процедура поиска окна:
BOOL
CALLBACK
FindToolbarProc (
HWND hwnd, // handle to child window
LPARAM lParam // application-defined value
)
{
// Определяем класс окна ...
//
TCHAR szBuffer[256];
GetClassName (
hwnd, // окно
szBuffer, // буфер
sizeof (szBuffer) / sizeof (szBuffer[0])); // размер буфера
// Сравниваем...
//
if (0 == lstrcmp (szBuffer, _T("ToolbarWindow32")))
{
// Нашли
//
*((HWND *) lParam) = hwnd;
return (FALSE); // больше не перечислять
}
return (TRUE); // продолжаем перечисление
} // FindToolbarProc
Правда остаеться один прикол... Нужно изменять разметы трея, а то кнопки удаляються, а вот "пустое место" остаеться... :)