Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3

Уведомление в Трее

12.06.2015, 13:08. Показов 3315. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Зравствуйте!!!

Вопрос уже изжованный давным давно и создана не одна тема, но всё же у меня есть вопросы.

Создаю иконку в системном трее возле часов кодом, а не при помощи компонента, таким образом:

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <vcl.h>
#include <shellapi.h>
#pragma hdrstop
#include "Unit1.h"
#include "Funcs.h"
#include "tchar.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
const int IDC_TRAY1      = 1;
const TCHAR *HINT_MESSAGE = L"Tray Hint Message";
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
 
 
    Timer1->Enabled = false;
    Timer1->Interval = 1000;
    TrayIcon = new Graphics::TIcon;
    ImageList1->GetIcon(1,TrayIcon);
}
//---------------------------------------------------------------------------
__fastcall TForm1::~TForm1()
{
    // Убираем иконку из трея, и удаляем указатель
    // TIcon, который был создан изначально.
    RemoveIcon();
    delete TrayIcon;
    TrayIcon = NULL;
}
 
void __fastcall TForm1::WMTrayNotify(TMessage &Msg)
{
    // Параметр LPARAM указывает на тип сообщения мышки.
    // При клике правой кнопкой, показываем меню. При двойном клике
    // левой кнопкой, показываем форму.
    switch(Msg.LParam)
    {
        case WM_RBUTTONUP:
            // Получаем координаты курсора мышки и показываем в этом
            // месте всплывающее меню.
            POINT WinPoint;
            GetCursorPos(&WinPoint);
            SetForegroundWindow(Handle);
            PopupMenu1->Popup(WinPoint.x,WinPoint.y);
            PostMessage(Handle, WM_NULL, 0,0);
            break;
       //   case WM_LBUTTONDBLCLK:
         case WM_LBUTTONUP:
            Visible = true;
            ShowWindow(Application->Handle, SW_SHOW);
 
            break;
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::AddIcon()
{
 
   try
    {
    NOTIFYICONDATA IconData;
    IconData.cbSize = sizeof(NOTIFYICONDATA);
    IconData.uID = IDC_TRAY1;
    IconData.hWnd = Handle;
    IconData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
    IconData.uCallbackMessage = WM_TRAYNOTIFY;
    lstrcpy(IconData.szTip, HINT_MESSAGE);
    IconData.hIcon = TrayIcon->Handle;
    Shell_NotifyIcon(NIM_ADD, &IconData);
    }
    catch(Exception &E)
    {
       MessageDlg(E.Message, mtError, TMsgDlgButtons() << mbOK, 0);
       Application->Terminate();
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RemoveIcon()
{
    NOTIFYICONDATA IconData;
    IconData.cbSize = sizeof(NOTIFYICONDATA);
    IconData.uID = IDC_TRAY1;
    IconData.hWnd = Handle;
    IconData.hIcon = TrayIcon->Handle;
 
    Shell_NotifyIcon(NIM_DELETE, &IconData);
}
Иконка в системном трее создаётся так как надо. Но мне необходимо функцию для создания баллуна и также функцию для его сокрытия. Вот как раз эти 2 функции мне не удаётся создать. Вернее одну на показ я сделал, но она не работает. Кстати вот она:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void __fastcall TForm1::ShowBalloon()
 {
 NOTIFYICONDATA IconData;
 IconData.cbSize = sizeof(NOTIFYICONDATA);
 IconData.uID = IDC_TRAY1;
 IconData.hWnd = Handle;
 IconData.hIcon = TrayIcon->Handle;
 IconData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
 IconData.uCallbackMessage = WM_TRAYNOTIFY;
 wcscpy(IconData.szInfo, L"Привет! :)");
 wcscpy(IconData.szInfoTitle, L"Сообщение");
 IconData.dwInfoFlags = NIIF_INFO;
 IconData.uTimeout = 5000;
 Shell_NotifyIcon(NIM_MODIFY, &IconData);
 }
Так вот ребята, помогите, согласно моему коду доделать эти 2 функции. Заранее благодарен за помощь!!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.06.2015, 13:08
Ответы с готовыми решениями:

Уведомление в трее
Вопрос: есть БД в Аксес нужно сделать программку такую чтобы на админском компьютере за 1 день он был уведомлен что абону нужно проплатить...

Уведомление в трее при выполнении условия
Есть две ячейки - в одной параметр, в другой текст. Необходимо: при определённом значении параметра автоматически запусть другую...

Приложение в трее и контекстное меню в трее
Хочу сделать приложение, которое сидело бы только в трее в виде иконки и по клику правой клавиши мыши выскакивало контекстное меню....

17
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
12.06.2015, 14:36
Цитата Сообщение от Sasha Посмотреть сообщение
но она не работает
Разумеется. Флажка NIM_INFO нет, вот и не работает.
C++
8
IconData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP | NIF_INFO;
, теперь заработает. А чтобы закрыть баллун - надо поменять строку №10
C++
10
 wcscpy(IconData.szInfo, L"");
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
12.06.2015, 15:14  [ТС]
volvo, странно на иконке жму левой кнопкой мыши балун не появляется.
Хотя написано вот так

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
void __fastcall TForm1::WMTrayNotify(TMessage &Msg)
{
    // Параметр LPARAM указывает на тип сообщения мышки.
    // При клике правой кнопкой, показываем меню. При двойном клике
    // левой кнопкой, показываем форму.
    switch(Msg.LParam)
    {
        case WM_RBUTTONUP:
            // Получаем координаты курсора мышки и показываем в этом
            // месте всплывающее меню.
            POINT WinPoint;
            GetCursorPos(&WinPoint);
            SetForegroundWindow(Handle);
            PopupMenu1->Popup(WinPoint.x,WinPoint.y);
            PostMessage(Handle, WM_NULL, 0,0);
            break;
       //   case WM_LBUTTONDBLCLK:
         case WM_LBUTTONUP:
           ShowBalloon();
           break;
    }
}
//---------------------------------------------------------------------------------
void __fastcall TForm1::ShowBalloon()
 {
 NOTIFYICONDATA IconData;
 IconData.cbSize = sizeof(NOTIFYICONDATA);
 IconData.uID = IDC_TRAY1;
 IconData.hWnd = Handle;
 IconData.hIcon = TrayIcon->Handle;
 IconData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP | NIF_INFO;
 IconData.uCallbackMessage = WM_TRAYNOTIFY;
 wcscpy(IconData.szInfo, L"Привет! :)");
 wcscpy(IconData.szInfoTitle, L"Сообщение");
 IconData.dwInfoFlags = NIIF_INFO;
 IconData.uTimeout = 5000;
 Shell_NotifyIcon(NIM_MODIFY, &IconData);
 }
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
12.06.2015, 15:19
У меня нормально появляется.
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
12.06.2015, 15:48  [ТС]
Хм...странно
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
12.06.2015, 15:49
Sasha, версия Билдера и версия ОС?
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
12.06.2015, 15:55  [ТС]
XE4, Windows XP
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
12.06.2015, 15:59
Лучший ответ Сообщение было отмечено Sasha как решение

Решение

XP. Вот почему
Замени
C++
1
2
// IconData.cbSize = sizeof(NOTIFYICONDATA);
IconData.cbSize = NOTIFYICONDATA_V2_SIZE;
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
12.06.2015, 21:30  [ТС]
Да volvo, помогло спасибо, но тут есть ещё один нюанс. Почему-то таймаут я ставлю на 2000, т.е 2 секунды, а балун почему-то висит больше 2-х секунд?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void __fastcall TForm1::ShowBalloon()
 {
 NOTIFYICONDATA IconData;
 //IconData.cbSize = sizeof(NOTIFYICONDATA);
 IconData.cbSize = NOTIFYICONDATA_V2_SIZE;//для XP
 IconData.uID = IDC_TRAY1;
 IconData.hWnd = Handle;
 IconData.hIcon = TrayIcon->Handle;
 IconData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP | NIF_INFO;
 IconData.uCallbackMessage = WM_TRAYNOTIFY;
 wcscpy(IconData.szInfo, L"Привет! :)");
 wcscpy(IconData.szInfoTitle, L"Сообщение");
 IconData.dwInfoFlags = NIIF_INFO;
 IconData.uTimeout = 2000;
 Shell_NotifyIcon(NIM_MODIFY, &IconData);
 }
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
12.06.2015, 21:37
А вот с этим я уже помочь не могу, в WinVista это поле было выведено из игры, теперь длительность задержки регулируется системными настройками. Но почитай MSDN, может, чего нароешь...
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
12.06.2015, 22:30  [ТС]
volvo, тут написано вот так вот

Shell32.dll Version cbSize
6.0.6 or higher (Windows Vista and later) sizeof(NOTIFYICONDATA)
6.0 (Windows XP) NOTIFYICONDATA_V3_SIZE
5.0 (Windows 2000) NOTIFYICONDATA_V2_SIZE
Versions lower than 5.0 NOTIFYICONDATA_V1_SIZE

Получается что в моём коде вообще лучше использовать NOTIFYICONDATA_V3_SIZE

Добавлено через 18 минут
Цитата Сообщение от volvo Посмотреть сообщение
в WinVista это поле было выведено из игры
volvo, ты хочешь сказать в ОС WinVista вообще uTimeout на балунах не используется?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
12.06.2015, 23:03
Я-то при чем? Разработчик ОС говорит об этом.

Не, ну можно, конечно, заставить эмулировать поведение старой ОС (используя uVersion = NOTIFYICON_VERSION), но вот только надо ли оно?
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
15.06.2015, 09:12  [ТС]
volvo, я ещё хотел уточнить как видно из кода вверху, что очень много повторяющихся строк. Так вот можно ли часть их убрать или объеденить в одну функцию, а потом вызывать в нужных местах? Или же оставить всё как есть?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
15.06.2015, 09:54
Можешь те строки заполнения структуры, которые одинаковы для всех операций, вынести в отдельный метод формы, и вызывать его для всех действий, а потом просто добавлять заполнение тех полей, которые требуются при конкретной операции, и вызывать Shell_NotifyIcon. Это немного разгрузит код.
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
15.06.2015, 11:00  [ТС]
volvo, а разве не достаточно просто где нибудь в FormCreate инициализировать всю структуру, а потом в нужных методах использовать всего лишь несколько строк необходимых для работы конкретного метода структура ж веерху уже будет заполнена и повторно вызывать её не надо? Что скажешь?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
15.06.2015, 12:22
Я не делаю так обычно. Потому что во-первых, зачем где-то еще дополнительную структуру хранить, а во-вторых, никто ж не гарантировал, что после вызова Shell_NotifyIcon данные в структуре обязаны остаться валидными. Вот так вызовешь, данные изменятся, а ты будешь надеяться, что они прежние, и получишь бред при дальнейшей работе с этой структурой.
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
15.06.2015, 12:44  [ТС]
Вообщем сделал так
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
71
72
void __fastcall TForm1::AddIcon()
{
    ParamsIcon();
   try
    {
      Shell_NotifyIcon(NIM_ADD, &IconData);
    }
    catch(Exception &E)
    {
       MessageDlg(E.Message, mtError, TMsgDlgButtons() << mbOK, 0);
       Application->Terminate();
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RemoveIcon()
{
  ParamsIcon();
  Shell_NotifyIcon(NIM_DELETE, &IconData);
}
 
 void __fastcall TForm1::ShowBalloon(String Info, String InfoTitle, int InfoFlags)
 {
 ParamsIcon();
 wcscpy(IconData.szInfo, Info.w_str());
 wcscpy(IconData.szInfoTitle, InfoTitle.w_str());
 IconData.dwInfoFlags = InfoFlags;  // NIIF_INFO, NIIF_ERROR NIIF_WARNING NIIF_NONE
 IconData.uTimeout = 2000;
 Shell_NotifyIcon(NIM_MODIFY, &IconData);
 }
 
 
 
void __fastcall TForm1::ExitClick(TObject *Sender)
{
Application->Terminate();
}
//---------------------------------------------------------------------------
 
 
 
 
 
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if(FindWindow(L"Progman",0))
   {
    AddIcon();
    Timer1->Enabled = false;
 
   }
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 
    ShowWindow(Application->Handle, SW_HIDE);
    Application->ShowMainForm = false;
    Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ParamsIcon()
{
    IconData.cbSize = sizeof(NOTIFYICONDATA);
    IconData.uID = IDC_TRAY1;
    IconData.hWnd = Handle;
    IconData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP | NIF_INFO;
    IconData.uCallbackMessage = WM_TRAYNOTIFY;
    lstrcpy(IconData.szTip, HINT_MESSAGE);
    IconData.hIcon = TrayIcon->Handle;
}
0
1408 / 572 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
16.06.2015, 15:03
Sasha, можно сделать проверку версии виндовс с помощью CheckWin32Version и уже потом выбирать sizeof для cbSize

Добавлено через 3 минуты
+
https://www.cyberforum.ru/post3202945.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.06.2015, 15:03
Помогаю со студенческими работами здесь

Программа в трее
Всем доброго времени суток, имеется программа! На форме лежит компонент TrayIcon, при сворачивании формы она появляется в трее, но на...

Меню в трее
Как сделать чтобы при нажатии на иконку в трее показывалось мини меню?

Программа в трее
Добрый день! Встала задача сделать так, чтобы при запуске программа сразу сворачивалась в трей, и по двойному клику на иконку в трее...

Активность в трее
Нужно сделать так, чтобы при наведении на иконку в трее время продолжало идти, т.е: навел на трей и время идет, а не просто показывает...

Иконка в трее
Всем здравствуйте. Можете мне подсказать, как сделать так, чтобы иконка NotifyIcon в трее не пряталась, а была всегда видна? Или это...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru