Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648

Как избежать исчезновения значка в SysTray при перезагрузке проводника?

05.03.2018, 06:16. Показов 1510. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравствуйте.

Используем пример из Examples/Apps/TrayIcon (Borland C++Builder6)
(Архив с примером прикреплён к вопросу).
Запускаем откомпилированный экзешник, сворачиваемся в SysTray.
Выгружаем из памяти с помощью диспетчера задач все экземпляры проводника (до появления "чистого" рабочего стола, без значков).
Запускаем с помощью диспетчера новую задачу explorer.exe. Всё восстановится, в том числе различные значки в SysTray.
А вот наше приложение (trayicon.exe) оставаясь невыгруженным из памяти свой значок в SysTray потеряет.
Как от этого глюка убежать?
Понимаю тех, кто скажет, пользуйтесь многочисленными компонентами сторонних производителей, но прошу эту тему (доп компонентов)не поднимать. Глюк с перезагрузкой explorera о котором идёт речь явление довольно частое для всех Windows. При этом особое раздражение вызывает случай, когда свёрнутое в трей приложение не допускает (по замыслу программиста) запуска своей второй копии.
Описанная проблема решаема для приложения на Win32 API (Visual Studio 2010), она учтена в элементе управления NotifyIcon упомянутой Visual Studio, а как сие реализовать в Builder непонятно.
Вложения
Тип файла: rar trayicon.rar (6.7 Кб, 2 просмотров)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.03.2018, 06:16
Ответы с готовыми решениями:

Life sycle страницы + web control. Как устранить ошибку исчезновения контрола при клике по кнопке в нем
Тестовый website добавлен в архиве. Вся проблема описана в коде в комментариях, но повторюсь: Есть страница, есть webcontrol c...

Как избежать остановки таймера при выскакивании MsgBox и при нажатии на кнопку “закрыть”?
Например, во время работы программы работает таймер времени, который показывает, сколько времени осталось до завершения работы программы,...

Исчезновения меню при скроллинге
Исчезновения верхнего меню при скроллинге вниз и появление при скроллинг верх не могу найти такой код может есть у кого в пример?

17
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
05.03.2018, 11:13
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

При старте приложения через RegisterWindowMessage зарегистрировать сообщение с именем TaskbarCreated, и потом ловить его, как только оно получено - значит, был пересоздан таскбар, и нужно заново добавить в трей иконку. Это прекрасно описано в MSDN, то же самое делается и в Дельфи/Билдере через переопределение метода WndProc
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
05.03.2018, 12:47  [ТС]
volvo, идея понятна. Как реализовать нет. Что значит переопределить оконную процедуру конкретно в C++builder? Попробовал вставить код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//---------------------------------------------------------------------------
void __fastcall TForm1::WndProc(Winapi::Messages::TMessage &Message)
{
    TForm::WndProc(Message);
    if (Message.Msg == TBC)
    {
        ShowMessage("TaskbarCreated");
    }
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    TBC = RegisterWindowMessage(TEXT("TaskbarCreated"));
}
//---------------------------------------------------------------------------
компилятор говорит, что не определено Winapi.
Пример бы?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
05.03.2018, 12:52
Значит, Билдер старый. Тогда просто:

C++
1
2
3
4
// в классе формы:
// ...
    protected:
        virtual void __fastcall WndProc(TMessage &message);
C++
1
2
3
4
5
6
7
8
9
10
// реализация:
//---------------------------------------------------------------------------
void __fastcall TForm1::WndProc(TMessage &message)
{
    TForm::WndProc(message);
    if (message.Msg == TBC)
    {
        // тут добавляем иконку в трей
    }
}
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
05.03.2018, 13:25  [ТС]
volvo, в C++Builder6 в классе формы нет раздела protected, только __published:, private:, public: ?
0
 Аватар для Серж762
1814 / 885 / 223
Регистрация: 10.02.2018
Сообщений: 3,682
05.03.2018, 13:30
Цитата Сообщение от jkrnd Посмотреть сообщение
в C++Builder6 в классе формы нет раздела protected
По умолчанию нету, но можно дописать !! как и сделали в п.4
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
05.03.2018, 15:23  [ТС]
Цитата Сообщение от Серж762 Посмотреть сообщение
можно дописать !! как и сделали в п.4
не пропускает компилятор
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
05.03.2018, 15:31
Показывай код h-файла полностью
1
05.03.2018, 15:38

Не по теме:


Коты общаются

0
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
05.03.2018, 15:38  [ТС]
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
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
//----------------------------------------------------------------------------
//Borland C++Builder
//Copyright (c) 1987, 1998-2002 Borland International Inc. All Rights Reserved.
//----------------------------------------------------------------------------
//---------------------------------------------------------------------------
#ifndef traymainH
#define traymainH
//---------------------------------------------------------------------------
#include <Forms.hpp>
#include <StdCtrls.hpp>
#include <Controls.hpp>
#include <Classes.hpp>
#include <ExtCtrls.hpp>
#include <Menus.hpp>
#include <Graphics.hpp>
#define MYWM_NOTIFY         (WM_APP+100)
#define IDC_MYICON                     1006
extern HINSTANCE g_hinst;
LRESULT IconDrawItem(LPDRAWITEMSTRUCT lpdi);
//---------------------------------------------------------------------------
class TFormMain : public TForm
{
 
__published:
    TButton *Button1;
    TCheckBox *CheckBox1;
    TRadioButton *RadioButton1;
    TRadioButton *RadioButton2;
    TEdit *Edit1;
    TEdit *Edit2;
    TImage *Image2;
    TImage *Image1;
    TLabel *Label1;
    TLabel *Label2;
    TPopupMenu *PopupMenu1;
    TMenuItem *Properties1;
    TMenuItem *ToggleState1;
    TMenuItem *Shutdown1;
    void __fastcall FormDestroy(TObject *Sender);
    void __fastcall CheckBox1Click(TObject *Sender);
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall RadioButtonClick(TObject *Sender);
    void __fastcall EditKeyUp(TObject *Sender, WORD &Key, TShiftState Shift);
    void __fastcall Properties1Click(TObject *Sender);
    void __fastcall ToggleState1Click(TObject *Sender);
    void __fastcall Shutdown1Click(TObject *Sender);
    void __fastcall FormCreate(TObject *Sender);
 
protected:
    virtual void __fastcall WndProc(TMessage &message);
    //virtual void __fastcall WndProc(TMessage& Msg);  // пробовал и так - не работает
 
private:        // private user declarations
    void __fastcall DrawItem(TMessage& Msg);
    void __fastcall MyNotify(TMessage& Msg);
    bool __fastcall TrayMessage(DWORD dwMessage);
    HICON __fastcall IconHandle(void);
    void __fastcall ToggleState(void);
    PSTR __fastcall TipText(void);
public:         // public user declarations
    virtual __fastcall TFormMain(TComponent* Owner);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DRAWITEM,TMessage,DrawItem)
MESSAGE_HANDLER(MYWM_NOTIFY,TMessage,MyNotify)
END_MESSAGE_MAP(TForm)
};
//---------------------------------------------------------------------------
extern TFormMain *FormMain;
//---------------------------------------------------------------------------
#endif
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
05.03.2018, 16:16
Проверил на чистом проекте, такое описание метода, как приведено у тебя выше - прекрасно компилируется на BCB6. Что тебе за ошибку выдает компилятор?
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
05.03.2018, 16:57  [ТС]
volvo, блин! Загрузил проект скомпилировал - всё ОК. Чудеса. Извиняюсь. Буду дальше копать.

Не по теме:

Наверное стоит бросить мучать проект-пример с классом TTrayIcon и сделать всё самому как в msdn.



Добавлено через 14 минут
практически получилось! Теперь при перезагрузке проводника появляется сообщение: TaskbarCreated. осталось заменить его на код, отвечающий за перерисовку иконки. Спасибо!

Добавлено через 5 минут
Цитата Сообщение от volvo Посмотреть сообщение
Значит, Билдер старый

Не по теме:

какой порекомендуете? Важно, чтобы он шёл под WinXP

0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
05.03.2018, 17:31
Цитата Сообщение от jkrnd Посмотреть сообщение
какой порекомендуете?
Пока я сидел под Windows - у меня был XE4, он прекрасно идет под WinXP.
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
26.04.2018, 19:44  [ТС]
volvo, а для случая использования компонента TrayIcon (вкладка Samples) как заново добавляем иконку в трэй?
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
UINT TBC;
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    // Зарегистрировать сообщение с именем TaskbarCreated
    TBC = RegisterWindowMessage(TEXT("TaskbarCreated"));
}
 
//---------------------------------------------------------------------------
void __fastcall TForm1::WndProc(TMessage &Message)
{
    TForm::WndProc(Message);
    //  Ловим сообщение с именем TaskbarCreated, как только оно получено - значит, был пересоздан таскбар, и нужно заново добавить в трей иконку
    if (Message.Msg == TBC)
    {
        //ShowMessage("TaskbarCreated");
        // Заново добавляем иконку в трэй
        TrayIcon1->Restore();                // Не добавляется!
        TrayIcon1->Update();                 // Не добавляется!
        TrayIcon1->SetDefaultIcon();      // Не добавляется!
        TrayIcon1->ShowMenu();            // Не добавляется!
 
    }
}
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
26.04.2018, 20:51
Со вкладки Samples - без понятия, оно мне неинтересно, а вот со стандартным TTrayIcon вполне себе проходит трюк с динамическим созданием/пересозданием:

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
void __fastcall TForm1::CreateTI() // не забудь в класс формы добавить прототип и поле TTrayIcon *MyTI...
{
    MyTI = new TTrayIcon(Application);
    MyTI->Visible = true;
    MyTI->Icons = ImageList1;
    MyTI->IconIndex = 0;
    MyTI->PopupMenu = PopupMenu1;
}
 
 
//---------------------------------------------------------------------------
void __fastcall TForm1::WndProc(TMessage &Message)
{
    TForm::WndProc(Message);
    //  Ловим сообщение с именем TaskbarCreated, как только оно получено - значит, был пересоздан таскбар, и нужно заново добавить в трей иконку
    if (Message.Msg == TBC)
    {
        FreeAndNil(&MyTI); // пересоздаем
        CreateTI();
    }
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    // Зарегистрировать сообщение с именем TaskbarCreated
    TBC = RegisterWindowMessage(TEXT("TaskbarCreated"));
    CreateTI();
}
Проверено на XP SP3, иконка пересоздается, и остается совершенно работоспособной (менюшка отображается при нажатии)
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
26.04.2018, 22:02  [ТС]
volvo, в CreateTI() я добавил
C++
1
MyTI->PopupMenuOn = imRightClickUp;
Всё работает. Спасибо.

Добавлено через 21 секунду
Проверено на Win8.1
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
26.04.2018, 22:10
Это с TCTrayIcon? На XP с ним такой фокус не прошел, так что будь аккуратнее с этим, а то перестанет работать у пользователей, привыкших к XP, а таких и до сих пор немало...
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
26.04.2018, 22:29  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
TCTrayIcon
Это ещё один способ!? Сколько же их?

Добавлено через 14 минут
volvo, проверил в эмуляторе WinXP SP3 - всё работает как надо.

Не по теме:

За одно сделал для себя открытие: чтобы exe-файл заработал в системе без установленного буилдера (6.0) достаточно бросить в System32 всего 2 файла: bcbsmp60.bpl и vclx60.bpl.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.04.2018, 22:29
Помогаю со студенческими работами здесь

Исчезновения блока при нажатии
Привет. Решил перейти от теории к практике в js и застрял в такой функции: при нажатии на копку блок сверху должен пропадать. Если...

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

Как при перезагрузке страницы не удалять значения из формы ?
Есть обычная форма с input, select и т.д., после нажатия на click(кнопку), перезагружается страница и форма становится пустая, какие есть...

Как завершить программу при выходе из системы или перезагрузке?
Написал программу, которая &quot;сидит&quot; в трее. Просто &quot;сидит&quot; и ничего не делает - т.е. не нужно отслеживать её действия и посылать сообщения...

Как сохранить размер див окна при перезагрузке страницы?
&lt;head&gt; &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=windows-1251&quot; /&gt; &lt;title&gt;Документ без названия&lt;/title&gt; ...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru