Интересный вопрос. http://twister.rootkits.ru/sources/tray.rar - тут пример того, как вытащить из трея иконки с хинтами. Найдешь место в коде, где заполняется очередная структура TNPRIVICON (сорри, но там VB): Код (Text): Public Type TNPRIVICON hwnd As Long uID As Long uCallbackMessage As Long dwState As Long uVersion As Long hIcon As Long End Type Кажись hwnd - это и есть окно-владелец иконки. Если это так, то достаточно слать ему соответствующие сообщения...
Вот примерный код. Код (Text): BOOL CALLBACK FindTBWndClb(HWND hwnd, LPARAM lParam){ char szClassName[256]; GetClassName(hwnd, szClassName, 255); if (!strcmp(szClassName, "ToolbarWindow32")){ *(HWND *)lParam = hwnd; return FALSE; } return TRUE; } HWND GetTrayWnd(HWND *TrayNotifyWnd){ HWND res; APPBARDATA AppBar = {0}; res = FindWindow("Shell_TrayWnd", NULL); SetForegroundWindow(res); SendMessage(res, WM_ACTIVATE, WA_ACTIVE, (LPARAM)res); res = FindWindowEx(res, NULL, "TrayNotifyWnd", NULL); if (TrayNotifyWnd) *TrayNotifyWnd = res; EnumChildWindows(res, FindTBWndClb, (LPARAM)&res); return res; } POINT GetBaloonPos(HWND hOwner, UINT uID, HWND *TrayNotifyWnd){ HWND hTray; RECT rcTray, rcIcon; DWORD dwProcId, iButtonCount, i, dwExtraData[2]; HANDLE hProc; PVOID pTBData; TBBUTTON btn; POINT res; hTray = GetTrayWnd(TrayNotifyWnd); GetWindowThreadProcessId(hTray, &dwProcId); hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, dwProcId); iButtonCount = (DWORD)SendMessage(hTray, TB_BUTTONCOUNT, 0, 0); pTBData = VirtualAllocEx(hProc, NULL, sizeof(TBBUTTON), MEM_COMMIT, PAGE_READWRITE); for (i = 0; i < iButtonCount; i++){ SendMessage(hTray, TB_GETBUTTON, i, (LPARAM)pTBData); ReadProcessMemory(hProc, pTBData, &btn, sizeof(TBBUTTON), NULL); ReadProcessMemory(hProc, (PVOID)btn.dwData, dwExtraData, 8, NULL); if (((HWND)((__int64)dwExtraData[0]) != hOwner) || (dwExtraData[1] != uID)) continue; SendMessage(hTray, TB_GETITEMRECT, i, (LPARAM)pTBData); ReadProcessMemory(hProc, pTBData, &rcIcon, sizeof(RECT), NULL); break; } VirtualFreeEx(hProc, pTBData, 0, MEM_RELEASE); CloseHandle(hProc); GetWindowRect(hTray, &rcTray); ShowWindow(hTray, SW_SHOWNORMAL); MapWindowPoints(hTray, HWND_DESKTOP, (PPOINT)&rcIcon, 2); res.x = rcIcon.left + 4; res.y = rcIcon.top + 6; return res; }
Поздновато, но вдруг, кто не в курсе. Win32 API. Урок 23. Иконка в system tray WM_LBUTTONDOWN WM_LBUTTONUP