Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 30.10.2018
Сообщений: 25

Как получить список значков в области уведомлений

04.07.2019, 05:58. Показов 1678. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Куда копать ?
пробовал GetWindowLong(hWnd, GWL_STYLE); не получается
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.07.2019, 05:58
Ответы с готовыми решениями:

Удаление значков из области уведомлений
В списке "Значки области уведомлений", остались записи от программ, которые были деинсталированы(через панель управление, удаление...

Отсутствует настройка скрытия значков в области уведомлений
Не работат функция скрытые значки в Win 10,....отсутствует режим "настройка" ?????

Удаление значков из области уведомлений (трея) Windows XP
Имеется хороший батник, для того, чтобы удалить неиспользуемые значки Прежних элементов в уведомлениях. Раньше всегда пользовался этим...

12
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33394 / 21504 / 8236
Регистрация: 22.10.2011
Сообщений: 36,900
Записей в блоге: 12
04.07.2019, 08:33
Мониторинг системного трея

Больше информации - здесь (правда, на Дельфи, но какая разница?)
1
0 / 0 / 0
Регистрация: 30.10.2018
Сообщений: 25
05.07.2019, 03:57  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
struct TTBBUTTON {
  int iBitmap;
  int idCommand;
  unsigned char fsState;
  unsigned char fsStyle;
  void* dwData;
  Char* iString;
};
 
void __fastcall TForm1::Button5Click(TObject *Sender)
{
    //test();
    HWND wndTray;
    DWORD dwTray;
    void* remoteTray = NULL;
    TTBBUTTON tdata;
    DWORD btsread = 0;
    HWND Window;
    unsigned long *RBytes = 0;
    Char* str = NULL;
    wndTray = FindTrayToolbar();
 
    char  WindowName[255];
 
    long GetIconsCount;
    GetIconsCount = SendMessage( wndTray, TB_BUTTONCOUNT, 0, 0 );
    GetWindowThreadProcessId( wndTray, &dwTray );
    HANDLE hTray = OpenProcess( PROCESS_ALL_ACCESS, false, dwTray );
    if ( hTray != 0 )
    {
        remoteTray = VirtualAllocEx( hTray, NULL, sizeof( tdata ), MEM_COMMIT, PAGE_READWRITE );
        for ( int stop = GetIconsCount - 1, i = 0; i <= stop; i++)
        {
 
 
            SendMessage(FindTrayToolbar(), TB_GETBUTTON,  i , ((int) remoteTray ));
            ReadProcessMemory( hTray, remoteTray, &tdata, sizeof( tdata ), RBytes );
            ReadProcessMemory( hTray, tdata.dwData, &str, sizeof( HWND ), RBytes );
 
 
            
            Memo1->Lines->Add( str );
            
            
                 }
    }
}
//---------------------------------------------------------------------------
Но в str не попадает имя приложения, может где то не догоняю.
0
0 / 0 / 0
Регистрация: 30.10.2018
Сообщений: 25
05.07.2019, 10:23  [ТС]
Вот код поправил, частично заработал.
Но не из всех приложений получается считать имя и иконку.
Счетчик количества приложений в трее (GetIconsCount) определяется правильно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
struct TTBBUTTON {
  int iBitmap;
  int idCommand;
  unsigned char fsState;
  unsigned char fsStyle;
  void* dwData;
  Char* iString;
};
 
HWND FindTrayTool( )
{
  HWND result;
  result = FindWindow( L"Shell_TrayWND", NULL );
  result = FindWindowEx( result, 0, L"TrayNotifyWnd", NULL );
  result = FindWindowEx( result, 0, L"SysPager", NULL );
  result = FindWindowEx( result, 0, L"ToolbarWindow32", NULL );
  return result;
}
 
void __fastcall TForm1::Button5Click(TObject *Sender)
{
    //test();
    HWND wndTray;
    DWORD dwTray;
    void* remoteTray = NULL;
    TTBBUTTON tdata;
    DWORD btsread = 0;
    HWND Window;
    unsigned long *RBytes = 0;
    Char* str = NULL;
    wndTray = FindTrayTool();
 
    char  WindowName[255];
 
    long GetIconsCount;
    GetIconsCount = SendMessage( wndTray, TB_BUTTONCOUNT, 0, 0 );
    GetWindowThreadProcessId( wndTray, &dwTray );
    HANDLE hTray = OpenProcess( PROCESS_ALL_ACCESS, false, dwTray );
    if ( hTray != 0 )
    {
        remoteTray = VirtualAllocEx( hTray, NULL, sizeof( tdata ), MEM_COMMIT, PAGE_READWRITE );
        for ( int stop = GetIconsCount - 1, i = 0; i <= stop; i++)
        {
            SendMessage(FindTrayTool(), TB_GETBUTTON,  i , ((int) remoteTray ));
            ReadProcessMemory( hTray, remoteTray, &tdata, sizeof( tdata ), RBytes );
            ReadProcessMemory( hTray, tdata.iString, &str, sizeof( HWND ), RBytes );
 
            memset(WindowName,0,255);
            GetWindowTextA((HWND)str, WindowName, 255);
            Memo1->Lines->Add( WindowName );
 
            TIcon *aIcon = new TIcon;
            HICON hIcon = NULL;
 
            hIcon = (HICON)SendMessage((HWND)str, WM_GETICON, ICON_BIG, i);
            if(hIcon == NULL) hIcon = (HICON)GetClassLong((HWND)str, GCL_HICON);
            if(hIcon != NULL) aIcon->Handle= hIcon;
 
            TListItem *it = Form1->ListView2->Items->Add();
 
            it->Caption = WindowName;
            //it->Data = ClassName;
            it->ImageIndex = Form1->ListView2->LargeImages->AddIcon(aIcon);
            it->CancelEdit();
 
            //ReadProcessMemory( hTray, Ptr( tdata.iString ), str, 255, NULL );
        }
    }
}
//---------------------------------------------------------------------------
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33394 / 21504 / 8236
Регистрация: 22.10.2011
Сообщений: 36,900
Записей в блоге: 12
05.07.2019, 13:01
Сделал вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <commctrl.h>
#include <shellapi.h>
#include <psapi.h>
 
 
// ...
 
void __fastcall TForm2::Button1Click(TObject *Sender)
{
    TBBUTTON tdata;
    NOTIFYICONDATA tray;
    DWORD rBytes;
 
    std::auto_ptr<Graphics::TBitmap> bm(new Graphics::TBitmap);
    bm->SetSize(32, 32);
 
    HWND wndTray = FindTrayTool();
 
    int trayCount = ::SendMessage(wndTray, TB_BUTTONCOUNT, 0, 0);
 
    DWORD trayID = 0;
    ::GetWindowThreadProcessId(wndTray, &trayID);
    HANDLE trayHandle = 0;
    trayHandle = ::OpenProcess(PROCESS_ALL_ACCESS, 0, trayID);
    if(trayHandle)
    {
        LPVOID remoteTray = ::VirtualAllocEx(trayHandle, 0, sizeof(tdata), MEM_COMMIT, PAGE_READWRITE);
        for (int i = trayCount - 1; i >= 0; i--)
        {
            ::SendMessage(wndTray, TB_GETBUTTON, i, LPARAM(remoteTray));
            ::ReadProcessMemory(trayHandle, remoteTray, &tdata, sizeof(tdata), &rBytes);
            ::ReadProcessMemory(trayHandle, LPVOID(tdata.dwData), &tray, sizeof(tray), &rBytes);
 
            if(tdata.fsState != TBSTATE_HIDDEN)
            {
                TListItem *it = ListView2->Items->Add();
                String szName = tray.szTip + 6;
                it->Caption = ExtractFileName(szName);
                Memo1->Lines->Add(szName);
 
                bm->Canvas->Brush->Color = clWhite; // Добавлено, ибо без этого значки будут накладываться один на другой
                bm->Canvas->FillRect(Rect(0, 0, 31, 31));
 
                if(!::DrawIconEx(bm->Canvas->Handle, 0, 0, tray.hIcon, 16, 16, 0, 0, DI_MASK | DI_IMAGE))
                {
                    HICON hIcon = ::ExtractIconA(0, AnsiString(szName).c_str(), 0);
                    ::DrawIconEx(bm->Canvas->Handle, 0, 0, hIcon, 16, 16, 0, 0, DI_MASK | DI_IMAGE);
                    ::DestroyIcon(hIcon);
                }
                it->ImageIndex = ListView2->LargeImages->Add(bm.get(), 0);
            }
        }
        ::VirtualFreeEx(trayHandle, remoteTray, 0, MEM_RELEASE);
    }
    ::CloseHandle(trayHandle);
}
+ к проекту подключил файл \Embarcadero\RAD Studio\11.0\lib\win32\release\psdk\psapi .lib, все нормально заработало (все программы, которые есть в трее - отображаются) :
Миниатюры
Как получить список значков в области уведомлений  
1
0 / 0 / 0
Регистрация: 30.10.2018
Сообщений: 25
07.07.2019, 17:01  [ТС]
Можешь приложить свой проект
0
0 / 0 / 0
Регистрация: 30.10.2018
Сообщений: 25
07.07.2019, 17:18  [ТС]
У меня вот что
Миниатюры
Как получить список значков в области уведомлений  
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33394 / 21504 / 8236
Регистрация: 22.10.2011
Сообщений: 36,900
Записей в блоге: 12
07.07.2019, 21:10
Windows не 64-битная, случайно? Если да - то забудь об этом способе, и вообще об этой затее. Все вышеперечисленное работает только на 32-битных ОС-ях, причем гарантированно - только под WinXP, все остальное - лотерея, может заработать, а может - не заработать. Хотя мне удалось разными ухищрениями более или менее стабильно заставить программу вытаскивать сами иконки в 64-битном приложении на Win7 x64, но вот названия файлов - никак. Все время "explorer.exe" и всё тут. Завтра буду рядом с той машиной, где тот проект - прикреплю.
0
0 / 0 / 0
Регистрация: 30.10.2018
Сообщений: 25
08.07.2019, 04:25  [ТС]
Спасибо.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33394 / 21504 / 8236
Регистрация: 22.10.2011
Сообщений: 36,900
Записей в блоге: 12
08.07.2019, 09:24
Вот проект и результаты его работы (собирать именно под x64 для 64-битной Windows) :
Миниатюры
Как получить список значков в области уведомлений  
Вложения
Тип файла: 7z arch_thread2479503.7z (7.3 Кб, 15 просмотров)
0
0 / 0 / 0
Регистрация: 30.10.2018
Сообщений: 25
08.07.2019, 12:59  [ТС]
Большущее спасибо.
0
0 / 0 / 0
Регистрация: 30.10.2018
Сообщений: 25
09.07.2019, 11:42  [ТС]
Еще вопрос. Как имя папки вида {377-6AF0-444B-8957-A3773F02200E} преобразовать в читабельный вид ?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33394 / 21504 / 8236
Регистрация: 22.10.2011
Сообщений: 36,900
Записей в блоге: 12
09.07.2019, 12:35
Сделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
                    if(tdata.fsState != TBSTATE_HIDDEN)
                    {
                        TListItem *it = ListView2->Items->Add();
                        String szName = tray.szTip + 8; // x64 = 8; x32 = 14
 
                        String fullPath = szName;
                        GUID g = StringToGUID(ExtractFileDir(szName));
                        wchar_t *path = new wchar_t[256];
                        if(SHGetKnownFolderPath(g, 0, NULL, &path) == S_OK) // #include <shlobj.h>
                        {
                            fullPath = String().sprintf(L"%s\\%s", path, ExtractFileName(szName).c_str());
                        }
                        delete [] path;
 
                        it->Caption = ExtractFileName(szName);
                        Memo1->Lines->Add(fullPath);
 
                        bm->Canvas->Brush->Color = clWhite;
                        bm->Canvas->FillRect(Rect(0, 0, 31, 31));
 
                        if(!::DrawIconEx(bm->Canvas->Handle, 0, 0, tray.hIcon, 16, 16, 0, 0, DI_MASK | DI_IMAGE))
                        {
                            HICON hIcon = ::ExtractIcon(0, szName.c_str(), 0);
                            ::DrawIconEx(bm->Canvas->Handle, 0, 0, hIcon, 16, 16, 0, 0, DI_MASK | DI_IMAGE);
                            ::DestroyIcon(hIcon);
                        }
                        it->ImageIndex = ListView2->LargeImages->Add(bm.get(), 0);
                    }
, вроде работает:
Миниатюры
Как получить список значков в области уведомлений  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.07.2019, 12:35
Помогаю со студенческими работами здесь

Есть ли возможность поменять цвет системных значков, языка и времени в области уведомлений с белого на чёрный?
Есть ли возможность (в настройках, в реестре, как угодно) в Win10 поменять цвет системных значков, языка и времени в области уведомлений с...

В области уведомлений панели задач (справа где часы) стало появляться куча "пустых" значков
В области уведомлений панели задач (справа где часы) стало появляться куча &quot;пустых&quot; значков, когда я открываю окна или что-то еще...

Как в области уведомлений панели задач переместить значок Центра уведомлений?
Всем привет. Переставил Винду и внезапно в самом краю не часы, а этот центр. 7 лет пользуюсь пк и всегда крайними были часы, а теперь стало...

настройка значков и уведомлений
Здравствуйте такая проблема захожу в настройку значков и уведомлений которіе необходимо отображать на панели задач у меня там 2 уторента...

Отображение значков уведомлений
Доброго всем времени суток! Подскажите как программно поставить галочку для параметра &quot;Всегда отображать все значки и уведомления...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru