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; } |