Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/40: Рейтинг темы: голосов - 40, средняя оценка - 4.80
 Аватар для lanu4
15 / 15 / 5
Регистрация: 21.08.2012
Сообщений: 115
Записей в блоге: 2

Свернуть программу в трей

16.08.2013, 05:34. Показов 8419. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, столкнулся с проблемой,сворачивания программы в трей.
В C++ Builder XE2, компонент TrayIcon, по логике он, по крайней мере в Builder 6 это так.
К моему удивлению не обнаружил функции TrayIcon1->Minimize(); которая в 6м билдере, а в XE2 нету
Подскажите как в XE2 свернуть программу в трей?
PS сворачивается после 5 минут работы, так условие поставили.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.08.2013, 05:34
Ответы с готовыми решениями:

Свернуть программу в трей
Доброго времени суток, вот написал программу, подскажите как её свернуть в трей, и как потом вызвать при помощи горячих клавиш?

Как свернуть программу в трей?
Я разработал программу Ежедневник. но нужно что бы при закрытии она не закрывалась а сворачивалась в трей. как это сделать?

Как програмно свернуть в трей программу?
Сделал органайзер. Хочу чтобы он был в трее как стандартные часы. Как ето реализовать?

21
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
16.08.2013, 09:21
А сделать просто не видимым окно не пробывали, а в трее просто выставить иконку?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
16.08.2013, 11:14
Лучший ответ Сообщение было отмечено как решение

Решение

lanu4, на оф. сайте Эмбаркадеро есть пример использования TrayIcon
3
 Аватар для lanu4
15 / 15 / 5
Регистрация: 21.08.2012
Сообщений: 115
Записей в блоге: 2
16.08.2013, 11:26  [ТС]
Спасибо большое=)
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.08.2013, 17:16
Непонятно только зачем они меняют состояние окна ...
C++
1
WindowState = wsMinimized;
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
16.08.2013, 17:37
Если этого не сделать (а потом, соответственно, не присвоить состоянию wsNormal), то BringToFront() не сработает.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.08.2013, 17:41
Ну я как бы раньше так делал

*.h
C++
1
2
3
4
5
6
7
//------------------------------------------------------------------------------
     // Спрятать в панели задач
     void __fastcall WMSysCommand(TWMSysCommand&);
     // Отлов сообщения о нажатии кнопки свернуть
     BEGIN_MESSAGE_MAP
           MESSAGE_HANDLER(WM_SYSCOMMAND,TWMSysCommand,WMSysCommand);
     END_MESSAGE_MAP(TComponent);
*.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//---------------------------------------------------------------------------
//  Реализация сворачивания/разворачивания окна трей
//---------------------------------------------------------------------------
void __fastcall TFMyMailAgent::WMSysCommand(TWMSysCommand& Msg)
{           // Кнопка свернуть
    if (Msg.CmdType == SC_MINIMIZE) Visible= false;
    else DefWindowProc(Handle,WM_SYSCOMMAND,Msg.CmdType,MAKELPARAM(Msg.XPos,Msg.YPos));
 
    Msg.Result= 0;
}
//---------------------------------------------------------------------------
void __fastcall TFMyMailAgent::TrayIcon1Click(TObject *Sender)
{
    Visible= !Visible;
    if(Visible) SetForegroundWindow(Handle);
}
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
16.08.2013, 17:45
Раньше - это было раньше. Теперь такое не проходит. Просто изменение Visible и вызов SetForegroundWindow не выводят форму на передний план. По крайней мере, у меня сейчас результат был именно таким (Win7 + XE2)
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.08.2013, 17:46
Как бы работало и работает, но изредка появлялось сообщение
Cannot change Visible in OnShow or OnHide.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
16.08.2013, 17:50
Это не значит, что оно работает. Когда работает - никаких сообщений, которых ты не вызывал, в принципе появляться не должно. Если бы хотя бы "Как бы работало" - то у меня бы как бы показало или форму, или сообщение, правда? Почему я не вижу ни одного ни другого, а вижу только мерцающую желтым цветом иконку минимизированного приложения? Это ты называешь "как бы работает"? Если так - то мне такая "как бы работа" на фиг не нужна, я лучше будут использовать
C++
1
2
  WindowState = wsNormal;
  Application->BringToFront();
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.08.2013, 18:08
Цитата Сообщение от UI Посмотреть сообщение
Когда работает - никаких сообщений, которых ты не вызывал, в принципе появляться не должно.
Ну в том то и дело что "как бы" сообщение появляется очень редко, понять почему не могу...
Обычно это бывает когда программа только запустилась в свернутом режиме, появилась иконка и ты кликаеш по ней что бы увидеть форму, но опять же это происходит не всегда ...

Добавлено через 15 секунд
Цитата Сообщение от UI Посмотреть сообщение
По крайней мере, у меня сейчас результат был именно таким (Win7 + XE2)
XE3

Добавлено через 12 минут
В 99% случаев работает как ожидалось
0
 Аватар для lanu4
15 / 15 / 5
Регистрация: 21.08.2012
Сообщений: 115
Записей в блоге: 2
19.08.2013, 05:43  [ТС]
Просто странно, что ушли от TrayIcon1->Minimize(); и убрали в компоненте Restore. А так работает
0
569 / 169 / 22
Регистрация: 18.10.2012
Сообщений: 912
19.04.2014, 13:59
Доброго времени суток..
Уже почти неделю парюсь с этой задачей,.. свернуть программу в трей..
Все что смог найти в поиске на форуме и на просторах интернета, результата особенного не дало..
или не работает совсем или ошибки не понятные или работает не так как нужно..

Что мне требуется, программа будет висеть в автозагрузке, и при старте системы, она сразу должна повиснуть в трей не выводя ни какого окна на рабочий стол и выполнять свою функцию, а вот если пользователь захочет её открыть, то при щелчке на значок в треи, программа развернется, при нажатии на крестик, опять свернется в трей, чтобы вообще её выключить, будет предусмотрено меню с выходом...

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

пользуюсь builder XE3
0
569 / 169 / 22
Регистрация: 18.10.2012
Сообщений: 912
20.04.2014, 16:34
День добрый..
После еще долгих мучений и пробования разных вариантов, приблизился не много к своей цели..

Так при запуске программы прячу её в трей:
Кликните здесь для просмотра всего текста
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
void __fastcall TMainForm::FormActivate(TObject *Sender)
{
    TrayIcon->Visible=true;
    Application->Minimize();
    ShowWindow(Application->Handle, SW_HIDE);
}
 
 
void __fastcall TMainForm::FormResize(TObject *Sender)
{
  if (WindowState == wsMinimized)
        {
    Application->ShowMainForm = false;
    ShowWindow(Handle,SW_HIDE);
    ShowWindow(Application->Handle,SW_HIDE);
    TrayIcon->Visible = true;
        }
}
 
void __fastcall TMainForm::ApplicationEventsMinimize(TObject *Sender)
{
    TrayIcon->Visible=true;
    Application->Minimize();
    ShowWindow(Application->Handle, SW_HIDE);
}


Таким образом раскрываю её из трея:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void __fastcall TMainForm::N1Click(TObject *Sender)
{
    /*MainForm->Visible=true;
    TrayIcon->Visible=false;
    Application->Restore();
    Application->BringToFront(); */
 
    TrayIcon->Visible=false;
    Application->Restore();
    ShowWindow(Application->Handle, SW_SHOW);
    SetForegroundWindow(Application->Handle);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::TrayIconClick(TObject *Sender)
{
    N1->Click();
}


И остается последнее, это скрыть её опять в трей при нажатии на крестик:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
{
  Action = caNone;
  Hide();
    TrayIcon->Visible = true;
   //   Application->Minimize();
    Application->ShowMainForm = false; //прячем форму
      //    ShowWindow(Handle,SW_HIDE); // Скрываем программу
        ShowWindow(Application->Handle,SW_HIDE); // Скрываем кнопку с TaskBar'а
 
 }

Собственно это у меня ни как не работает, пробовал разные варианты

Вот если запустить с кодом который сейчас , то работает все следующим образом: При запуске программы, она сворачивается в трей, единичный щелчок по значку в трее раскрывает программу, нажимаю крестик, программа опять сворачивается в трей, появляется значок, И вот если сейчас по нему щелкнуть, значок исчезает ( программа не разворачивается ), и в Диспетчере задач, остается висеть процесс программы..

Подскажите пожалуйста как решить такую проблему....
0
☆ Форумчанин(FSC)☆
 Аватар для 2ima
911 / 292 / 27
Регистрация: 28.04.2013
Сообщений: 2,466
Записей в блоге: 10
20.04.2014, 17:09
вот от меня примерчик:


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
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  // Load the tray icons.
  TrayIcon1->Icons = new TImageList(this);
  TIcon *MyIcon = new TIcon;
  MyIcon->LoadFromFile("..//icons//earth1.ico");
  TrayIcon1->Icon->Assign(MyIcon);
  TrayIcon1->Icons->AddIcon(MyIcon);
 
  MyIcon->LoadFromFile("..//icons//earth2.ico");
  TrayIcon1->Icons->AddIcon(MyIcon);
  MyIcon->LoadFromFile("..//icons//earth3.ico");
  TrayIcon1->Icons->AddIcon(MyIcon);
  MyIcon->LoadFromFile("..//icons//earth4.ico");
  TrayIcon1->Icons->AddIcon(MyIcon);
 
  // Set up a hint message and the animation interval.
  TrayIcon1->Hint = "Hello World!";
  TrayIcon1->AnimateInterval = 200;
 
  // Set up a hint balloon.
  TrayIcon1->BalloonTitle = "Restoring the window.";
  TrayIcon1->BalloonHint =
    "Double click the system tray icon to restore the window.";
  TrayIcon1->BalloonFlags = bfInfo;
}
 
void __fastcall TForm1::ApplicationEvents1Minimize(TObject *Sender)
{
  // Hide the window and set its state variable to wsMinimized.
  Hide();
  WindowState = wsMinimized;
 
  // Show the animated tray icon and also a hint balloon.
  TrayIcon1->Visible = true;
  TrayIcon1->Animate = true;
  TrayIcon1->ShowBalloonHint();
}
 
void __fastcall TForm1::TrayIcon1DblClick(TObject *Sender)
{
  // Hide the tray icon and show the window,
  // setting its state property to wsNormal.
  TrayIcon1->Visible = false;
  Show();
  WindowState = wsNormal;
  Application->BringToFront();
}
Цитата Сообщение от duh_si Посмотреть сообщение
И остается последнее, это скрыть её опять в трей при нажатии на крестик:
напиши в событии OnCloseQuery:

C++
1
2
3
CanClose = false;
TrayIcon->Visible = true;
Form1->Hide();
Добавлено через 1 минуту
В том примере можешь найти то, что тебя интересует
1
569 / 169 / 22
Регистрация: 18.10.2012
Сообщений: 912
21.04.2014, 10:57
FSC, вот от меня примерчик:
этот примерчик я вот на этой ссылке уже смотрел http://docwiki.embarcadero.com... C%2B%2B%29

Этот код,
C++
1
2
3
CanClose = false;
TrayIcon->Visible = true;
Form1->Hide();
я тоже уже пробовал, он не решил моей проблемы

Добавлено через 17 часов 19 минут
Здравствуйте..
Исходя из предложенного кода FSC
Переделал все следующим образом
Кликните здесь для просмотра всего текста
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
#include <vcl.h>
#pragma hdrstop
#include "UTray.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
    : TForm(Owner)
{
  TrayIcon->Hint = "Сообщение ABS";
  TrayIcon->AnimateInterval = 200;
 
  TrayIcon->BalloonTitle = "Восстановить окно.";
  TrayIcon->BalloonHint =
    "Дважды щелкните значок на панели задач, чтобы восстановить окно.";
  TrayIcon->BalloonFlags = bfInfo;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ApplicationEventsMinimize(TObject *Sender)
{
  Hide();
  WindowState = wsMinimized;
 
  TrayIcon->Visible = true;
  TrayIcon->Animate = true;
  TrayIcon->ShowBalloonHint();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::N1Click(TObject *Sender)
{
  TrayIcon->Visible = false;
  Show();
  WindowState = wsNormal;
  Application->BringToFront();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormResize(TObject *Sender)
{
 /* if (WindowState == wsMinimized)
        {
    Application->ShowMainForm = false;
    ShowWindow(Handle,SW_HIDE);
    ShowWindow(Application->Handle,SW_HIDE);
    TrayIcon->Visible = true;
        }     */
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::N2Click(TObject *Sender)
{
Application->Terminate();
}
//---------------------------------------------------------------------------
 
void __fastcall TMainForm::FormActivate(TObject *Sender)
{
  WindowState = wsMinimized;
 
  TrayIcon->Visible = true;
  TrayIcon->Animate = true;
  ShowWindow(Application->Handle, SW_HIDE);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::TrayIconDblClick(TObject *Sender)
{
  TrayIcon->Visible = false;
  Show();
  WindowState = wsNormal;
  Application->BringToFront();
}
//---------------------------------------------------------------------------
 
void __fastcall TMainForm::FormCloseQuery(TObject *Sender, bool &CanClose)
{
CanClose = false;
 
  WindowState = wsMinimized;
 
  TrayIcon->Visible = true;
  TrayIcon->Animate = true;
  ShowWindow(Application->Handle, SW_HIDE);
  TrayIcon->ShowBalloonHint();
}


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

Подскажите пожалуйста каким способом можно справиться с этой задачей?
0
☆ Форумчанин(FSC)☆
 Аватар для 2ima
911 / 292 / 27
Регистрация: 28.04.2013
Сообщений: 2,466
Записей в блоге: 10
21.04.2014, 12:25
duh_si, при закрытии приложения поставить
C++
1
TrayIcon->Visible = false;
1
569 / 169 / 22
Регистрация: 18.10.2012
Сообщений: 912
21.04.2014, 13:44
FSC, неэ, не помогает, все равно на панели задач
висеть ярлык остается
Что еще можно попробовать, чтобы скрыть этот ярлык?
0
☆ Форумчанин(FSC)☆
 Аватар для 2ima
911 / 292 / 27
Регистрация: 28.04.2013
Сообщений: 2,466
Записей в блоге: 10
21.04.2014, 13:59
Цитата Сообщение от duh_si Посмотреть сообщение
панели задач
висеть ярлык остается
на панели задач или скрытых значков?
0
569 / 169 / 22
Регистрация: 18.10.2012
Сообщений: 912
21.04.2014, 14:11
FSC на панели задач или скрытых значков?
На панели задач нужно скрыть..

Посмотрите пожалуйста в архиве и своими глазами увидите как она работает
Вложения
Тип файла: zip TrayIcon.zip (341.0 Кб, 47 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.04.2014, 14:11
Помогаю со студенческими работами здесь

Свернуть программу в трей второй раз
Сделал сворачивание в трей://--------------------------------------------------------------------------- void __fastcall...

После запуска свернуть в трей
Доброго всем здравия не зависимо от времени суток! Делаю функцию которая после запуска свернет программу в трей. Я ее пробовал через...

Свернуть консоль в трей из оконного приложения
Добрый день. Пытаюсь свернуть консольное приложение программно по нажатию кнопки из оконного. пытаюсь делать по аналогии с найденными...

Спрятать программу в трей
Разместил компонент &quot;трейикон&quot; - подскажите какой нужно прописать код чтоб программа спряталась в трей.

FireMonkey - Как свернуть версию для Windows в трей ?
Хочу чтобы версия для Windows имела возможность быть свернутой в трей. Раньше (не в FireMonkey) я это делал так void...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru