Очень помог проект:
http://www.codeproject.com/tools/ShellTrayInfo.asp Мой код:
(Фунция принимает в качестве входного параметра дескриптор окна и идентификатор искомой иконки)
Код: BOOL CStudyTrayDlg::isCurOnTrayIcon(HWND hIconWnd, UINT iconID)
{
CString tmpStr = "";
struct TRAYDATA
{
HWND hwnd;
UINT uID;
UINT uCallbackMessage;
DWORD Reserved[2];
HICON hIcon;
};
//Получение дескриптора окна ToolbarWindow32 содержащего иконки
HWND hToolBarWnd = ::FindWindow(_T("Shell_TrayWnd"), NULL);
if(hToolBarWnd)
{
hToolBarWnd = ::FindWindowEx(hToolBarWnd, NULL, _T("TrayNotifyWnd"), NULL);
if(hToolBarWnd)
{
hToolBarWnd = ::FindWindowEx(hToolBarWnd , NULL, _T("SysPager"), NULL);
if(hToolBarWnd)
{
hToolBarWnd = ::FindWindowEx(hToolBarWnd, NULL, _T("ToolbarWindow32"), NULL);
}
}
}
if (hToolBarWnd == NULL)
{
AfxMessageBox("Не удалось получить дескриптор ToolbarWindow32!", MB_OK | MB_ICONSTOP);
return FALSE;
}
//Получение идентификатора процесса Tray
DWORD trayID;
GetWindowThreadProcessId(hToolBarWnd, &trayID);
//Получение количества кнопок в окне ToolbarWindow32
int countButton = (int)::SendMessage(hToolBarWnd, TB_BUTTONCOUNT, 0, 0);
//Получение дескриптора процесса по его ID
HANDLE hTrayProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, trayID);
if (!hTrayProc)
{
AfxMessageBox("Не удалось получить дескриптор процесса Tray!", MB_OK | MB_ICONSTOP);
return FALSE;
}
//Выделение памяти в процессе Tray для доступа к резултатам обработки посылаемых событий
const LPVOID pTrayData = VirtualAllocEx(
hTrayProc, //Дексриптор процесса в котором выделяем память
NULL, //Адресс начала выделения (NULL - выберается системой)
sizeof(TBBUTTON), //Размер выделяемой области памяти
MEM_COMMIT, //Программное распеределение памяти
PAGE_READWRITE //Разрешение на чтение и запись памяти
);
if (!pTrayData)
{
CloseHandle(hTrayProc);
AfxMessageBox("Не удалось выделить виртуальную память!", MB_OK | MB_ICONSTOP);
return FALSE;
}
const LPVOID pIconRect = pTrayData; //Переменная указывающая на туже области для структуры данных иконки
TBBUTTON buttonData = {0}; //Структура данных кнопки окна Toolbar
TRAYDATA iconData = {0}; //Cтруктура данных иконцки кнопки окна Toolbar
RECT iconRect = {0}; //Координаты иконки
//Получение координат иконки в окне Toolbar
for(int num = 0; num < countButton; ++num)
{
//Заполнение памяти структурой данных об кнопке Toolbar
::SendMessage(
hToolBarWnd, //Дескриптор окна Toolbar
TB_GETBUTTON, //Запрос информации об кнопках
num, //Номер кнопки от 0 до countButton
(LPARAM)pTrayData //Указатель на выделенную область памяти
);
//Считывание из памяти процесса структуры TBBUTTON
if (!ReadProcessMemory(
hTrayProc, //Дескриптор процесса
pTrayData, //Указатель на считываемую область памяти
(LPVOID)&buttonData, //Указатель на сохраняемую область памяти
sizeof(TBBUTTON), //Размер копируемой памяти
NULL //Количество считанных байт
)
)
{
VirtualFreeEx(hTrayProc, pTrayData, 0, MEM_RELEASE);
CloseHandle(hTrayProc);
AfxMessageBox("Не удалось прочитать память процесса!", MB_OK | MB_ICONSTOP);
return FALSE;
}
//Получение структуры TRAYDATA
if (!ReadProcessMemory(
hTrayProc,
(LPCVOID)buttonData.dwData,
&iconData,
sizeof(TRAYDATA),
NULL
)
)
{
VirtualFreeEx(hTrayProc, pTrayData, 0, MEM_RELEASE);
CloseHandle(hTrayProc);
AfxMessageBox("Не удалось прочитать память процесса!", MB_OK | MB_ICONSTOP);
return FALSE;
}
//Проверка соответсвия иконки заданным параметрам
//Критерий поиска дескриптор окна и идентификатор ресурса
if ((iconData.hwnd == hIconWnd) && (iconData.uID == iconID))
{
//Получение размера Icon
::SendMessage(hToolBarWnd, TB_GETRECT, buttonData.idCommand, (LPARAM)pIconRect);
if (!ReadProcessMemory(
hTrayProc,
pIconRect,
(LPVOID)&iconRect,
sizeof(RECT),
NULL
)
)
{
VirtualFreeEx(hTrayProc, pTrayData, 0, MEM_RELEASE);
CloseHandle(hTrayProc);
AfxMessageBox("Не удалось прочитать память процесса!", MB_OK | MB_ICONSTOP);
return FALSE;
}
break;
}
}
VirtualFreeEx(hTrayProc, pTrayData, 0, MEM_RELEASE);
CloseHandle(hTrayProc);
BOOL setIcon = FALSE; //Мышь над иконкой TRUE - да / FALSE - нет
RECT trayCRect = {0}; //Размер клиенской области окна
RECT trayWRect = {0}; //Координаты окна
POINT curPoint = {0}; //Координаты курсора мыши
::GetWindowRect(hToolBarWnd, &trayWRect);
::GetClientRect(hToolBarWnd, &trayCRect);
::GetCursorPos(&curPoint);
iconRect.top = trayWRect.top + iconRect.top + 1;
iconRect.left = trayWRect.left + iconRect.left + 1;
iconRect.right = trayWRect.left + iconRect.right - 1;
iconRect.bottom = trayWRect.top + iconRect.bottom - 1;
//Проверка поподания курсора мыши в область иконки
if ((iconRect.left < curPoint.x) && (iconRect.right > curPoint.x) && (iconRect.top < curPoint.y) && (iconRect.bottom > curPoint.y))
setIcon = TRUE;
return setIcon;
}