Программно нажать на иконку в трее

Тема в разделе "WASM.WIN32", создана пользователем CHeeBeez, 14 май 2008.

  1. CHeeBeez

    CHeeBeez New Member

    Публикаций:
    0
    Регистрация:
    22 окт 2006
    Сообщения:
    32
    Каким образом можно программно нажать на иконку в трее ? Интересуют любые варианты :)
     
  2. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Интересный вопрос.

    http://twister.rootkits.ru/sources/tray.rar - тут пример того, как вытащить из трея иконки с хинтами. Найдешь место в коде, где заполняется очередная структура TNPRIVICON (сорри, но там VB):
    Код (Text):
    1. Public Type TNPRIVICON
    2.     hwnd As Long
    3.     uID As Long
    4.     uCallbackMessage As Long
    5.     dwState As Long
    6.     uVersion As Long
    7.     hIcon As Long
    8. End Type
    Кажись hwnd - это и есть окно-владелец иконки. Если это так, то достаточно слать ему соответствующие сообщения...
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Вот примерный код.
    Код (Text):
    1. BOOL CALLBACK FindTBWndClb(HWND hwnd, LPARAM lParam){
    2.     char szClassName[256];
    3.  
    4.     GetClassName(hwnd, szClassName, 255);
    5.     if (!strcmp(szClassName, "ToolbarWindow32")){
    6.         *(HWND *)lParam = hwnd;
    7.         return FALSE;    
    8.     }    
    9.     return TRUE;
    10. }
    11.  
    12. HWND GetTrayWnd(HWND *TrayNotifyWnd){
    13.     HWND res;
    14.     APPBARDATA AppBar = {0};
    15.  
    16.     res = FindWindow("Shell_TrayWnd", NULL);
    17.     SetForegroundWindow(res);
    18.     SendMessage(res, WM_ACTIVATE, WA_ACTIVE, (LPARAM)res);
    19.     res = FindWindowEx(res, NULL, "TrayNotifyWnd", NULL);
    20.     if (TrayNotifyWnd)
    21.         *TrayNotifyWnd = res;
    22.     EnumChildWindows(res, FindTBWndClb, (LPARAM)&res);
    23.     return res;
    24. }
    25.  
    26. POINT GetBaloonPos(HWND hOwner, UINT uID, HWND *TrayNotifyWnd){
    27.     HWND hTray;
    28.     RECT rcTray, rcIcon;
    29.     DWORD dwProcId, iButtonCount, i, dwExtraData[2];
    30.     HANDLE hProc;
    31.     PVOID pTBData;
    32.     TBBUTTON btn;
    33.     POINT res;
    34.  
    35.     hTray = GetTrayWnd(TrayNotifyWnd);
    36.     GetWindowThreadProcessId(hTray, &dwProcId);
    37.     hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, dwProcId);
    38.     iButtonCount = (DWORD)SendMessage(hTray, TB_BUTTONCOUNT, 0, 0);
    39.     pTBData = VirtualAllocEx(hProc, NULL, sizeof(TBBUTTON), MEM_COMMIT, PAGE_READWRITE);
    40.     for (i = 0; i < iButtonCount; i++){
    41.         SendMessage(hTray, TB_GETBUTTON, i, (LPARAM)pTBData);
    42.         ReadProcessMemory(hProc, pTBData, &btn, sizeof(TBBUTTON), NULL);
    43.         ReadProcessMemory(hProc, (PVOID)btn.dwData, dwExtraData, 8, NULL);
    44.         if (((HWND)((__int64)dwExtraData[0]) != hOwner) || (dwExtraData[1] != uID))
    45.             continue;
    46.         SendMessage(hTray, TB_GETITEMRECT, i, (LPARAM)pTBData);
    47.         ReadProcessMemory(hProc, pTBData, &rcIcon, sizeof(RECT), NULL);
    48.         break;
    49.     }
    50.     VirtualFreeEx(hProc, pTBData, 0, MEM_RELEASE);
    51.     CloseHandle(hProc);
    52.     GetWindowRect(hTray, &rcTray);
    53.     ShowWindow(hTray, SW_SHOWNORMAL);
    54.     MapWindowPoints(hTray, HWND_DESKTOP, (PPOINT)&rcIcon, 2);
    55.     res.x = rcIcon.left + 4;
    56.     res.y = rcIcon.top + 6;
    57.     return res;
    58. }
     
  4. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    Поздновато, но вдруг, кто не в курсе.

    Win32 API. Урок 23. Иконка в system tray

    WM_LBUTTONDOWN
    WM_LBUTTONUP