Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как запустить программу в трей? / 14 сообщений из 14, страница 1 из 1
15.11.2004, 09:45
    #32781617
kima
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить программу в трей?
Всем привет!
Подскажите, пожалуйста, как при открытии программы сразу запустиь ее в трей!
Я пробовала в InitDialog() посылать сообщение
SendMessage(WM_SIZE, SIZE_MINIMIZED,0);
но это не сработала,
потом я в InitDialog создала таймер и по таймеру уже посылала это сообщение и прятала окно ShowWindow(SW_HIDE); Этот вариант работает, но проблымывает окно на экране, даже если ставить в таймере 1 милисекунду, мне такой результат не очень нравится...
Подскажите, пожалуйста, вариант получше, только по возможности хоть с какими-то пояснениями...
...
Рейтинг: 0 / 0
15.11.2004, 10:15
    #32781660
Ex_Soft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить программу в трей?
при запуске сразу в трей, минимизация
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
15.11.2004, 10:16
    #32781667
Alex_VC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить программу в трей?
Так все-таки в трей приложение надо засунуть или просто свернуть (в Task Bar) ? Приложение на основе диалогового окна? И что значит "проблымывает" (в сленге не очень силен)?
...
Рейтинг: 0 / 0
15.11.2004, 10:23
    #32781678
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить программу в трей?
В любом варианте, после создания окна зовётся функция ShowWindow, вот в ней надо правильный параметр поставить SW_SHOWMINIMIZED
...
Рейтинг: 0 / 0
15.11.2004, 10:55
    #32781750
Alex_VC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить программу в трей?
Вариант 1 (когда MDI,SDI)
В InitInstance() приложения после инициализации указателя на главное окно
вызываешь , к примеру, pFrame->ShowWindow(SW_MINIMIZE);
pFrame - этот указатель на главное окно

Вариант 2 (когда Dialog)
1) Переопределяешь в диалоге функцию OnShowWindow()
2) Вызываешь в этой функции this->ShowWindow(SW_MINIMIZE);

А вообще, вариантов может быть куча: кто как может извратиться...
...
Рейтинг: 0 / 0
15.11.2004, 13:12
    #32782144
kima
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить программу в трей?
Дело вот обстоит как:
По кнопке MINIMIZE (в заголовке окна) моя программа сворачивается не в прямоугольник на панели задач, а в иконку в трее. Для этого я переопределила ф-цию OnSize().
Теперь мне надо чтоб она сворачивалась в трей при запуске.
Я переопределила метод OnShowWindow(), добавила туда:
this->ShowWindow(SW_MINIMIZE);
this->ShowWindow(SW_HIDE);
в результате при отработке получаю, что программа и в трее появилась но и на понели задач прямоугольник висит все равно...
Как же мне от него избавиться?
...
Рейтинг: 0 / 0
15.11.2004, 21:39
    #32783130
fixit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить программу в трей?
kimaДело вот обстоит как:
По кнопке MINIMIZE (в заголовке окна) моя программа сворачивается не в прямоугольник на панели задач, а в иконку в трее. Для этого я переопределила ф-цию OnSize().
Теперь мне надо чтоб она сворачивалась в трей при запуске.
Я переопределила метод OnShowWindow(), добавила туда:
this->ShowWindow(SW_MINIMIZE);
this->ShowWindow(SW_HIDE);
в результате при отработке получаю, что программа и в трее появилась но и на понели задач прямоугольник висит все равно...
Как же мне от него избавиться?

Если работаешь на сибилдере, то в samples конкретный пример есть. Если на msvc то посмотри codeguru или codeproject - там есть также вполне разжеваные примеры.
...
Рейтинг: 0 / 0
16.11.2004, 06:18
    #32783310
Alex_VC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить программу в трей?
Есть апишная функция Shell_Notify, кажется называется. Заполняешь структуру NOTIFY..., которая передается в первом параметре и вид действия (2 параметр). В MSDN-е все написано. После вызова этой функции надо вызвать ShowWindow(SW_HIDE) - приложение скроется в SysTray. Для обратного раскрытия необходимо определить свое сообщение и обработчик на него. Id сообщения передать в качестве значения одного из членов структуры NOTIFY... (в имени есть ...CallBack...). В обработчике вызвать ShowWindow(SW_RESTORE) ну и если надо из трея удалить иконку - Shell_Notify с действием удаления (NIF_DELETE кажется)
...
Рейтинг: 0 / 0
16.11.2004, 08:45
    #32783409
Siebentearbeit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить программу в трей?
Кнопка в панели задач зависит от стиля окна.
Чтобы оно в таскбар не попадало, надо задать окну (расширенный)стиль WS_EX_TOOLWINDOW при нажатии кнопки минимизации. Но вообще, при скрытии окна, кнопка в таскбаре тоже пропадает.... Стало быть.. чё-то не то скрываете тут :)
Код: plaintext
this->ShowWindow(SW_HIDE);
...
Рейтинг: 0 / 0
18.11.2004, 15:24
    #32789420
kima
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить программу в трей?
Граждане, дорогие, ну подскажите еще варианты!
Может кто-то уже такое делал или встречал в сети, пришлите пример:
mck28@rambler.ru
...
Рейтинг: 0 / 0
19.11.2004, 07:40
    #32790392
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить программу в трей?
авторДля этого я переопределила ф-цию OnSize().

Стало быть, надо так же переопределить функцию OnActivate - которая дёргается по событию поднятия окна, и будет тебе счастье.
...
Рейтинг: 0 / 0
21.11.2004, 06:18
    #32792836
Fasimba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить программу в трей?
Смотри почту, без классов правда, "голый" WinAPI.
...
Рейтинг: 0 / 0
22.11.2004, 07:22
    #32793216
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить программу в трей?
kimaПодскажите, пожалуйста, как при открытии программы сразу запустиь ее в трей!

Здравствуйте, kima,
Недавно сделал примерно то же: мне надо было написать
приложение, которое бы выполнялось не выводя формы на экран.
(т.е. не надо было его сворачивать-разворачивать, а только показать,
что оно работает...)
Это "сухой остаток" из примера TrayIcon комплекта поставки
Borland C++Builder (У меня версия 5.0).
Попробуйте, может поможет...

Вот мой код:
Код: plaintext
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.
//--------------------------------------------------------------------
#include <vcl.h>
#include <shellapi.h>
#include <graphics.hpp>
#include "Unit1.h"
#pragma hdrstop
#pragma argsused
//-------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
//Начальные установки
 TImage *Image1=new TImage(NULL);
 NOTIFYICONDATA tnd;
 PSTR pszTip;
 AnsiString MessageText="Формирование черно-белых списков \r\nпо услуге \"Интернет в кредит\"";
 AnsiString path;
 int pos;

 pszTip = MessageText.c_str();

 Application->Initialize();
 Application->ShowMainForm=false; //it is analog of: ShowWindow(Application->Handle,SW_HIDE);
//Если сделать Application->Minimize(), то появляется кнопка на панели 
//задач, а нам это не надо...
//Path to user-defined icon file. Application haven't default icon because
//it is coverted from Console Application and haven't main form...
 path=Application->ExeName;
 pos=path.LastDelimiter("\\");
 path=path.SubString( 1 ,pos);
 path+="FLGRUS.ICO";

//Load icon file...
 if(FileExists(path))
   Image1->Picture->Icon->LoadFromFile(path);
 else
   Image1->Picture->Icon->Handle=NULL;

//Show icon within Tray...
 tnd.cbSize          = sizeof(NOTIFYICONDATA);
 tnd.hWnd            = Application->Handle ;
 tnd.uFlags          = NIF_MESSAGE | NIF_ICON | NIF_TIP;
 tnd.hIcon           = Image1->Picture->Icon->Handle ;
 lstrcpyn(tnd.szTip, pszTip, sizeof(tnd.szTip));
 Shell_NotifyIcon(NIM_ADD,&tnd);
 Shell_NotifyIcon(NIM_MODIFY,&tnd);

 < здесь остальной код моей программы >

//Delete icon form Tray...
 Application->Terminate();
 tnd.hIcon = NULL ;
 Shell_NotifyIcon(NIM_DELETE,&tnd);
 return false;// The main form will NOT BE displayed in any cases...
}
//--------------------------------------------------------------------
С уважением,
Станислав C.
...
Рейтинг: 0 / 0
23.12.2004, 23:20
    #32842853
drug
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запустить программу в трей?
Станислав C. kimaПодскажите, пожалуйста, как при открытии программы сразу запустиь ее в трей!

Здравствуйте, kima,
Недавно сделал примерно то же: мне надо было написать
приложение, которое бы выполнялось не выводя формы на экран.
(т.е. не надо было его сворачивать-разворачивать, а только показать,
что оно работает...)
Это "сухой остаток" из примера TrayIcon комплекта поставки
Borland C++Builder (У меня версия 5.0).
Попробуйте, может поможет...

Вот мой код:
Код: plaintext
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.
//--------------------------------------------------------------------
#include <vcl.h>
#include <shellapi.h>
#include <graphics.hpp>
#include "Unit1.h"
#pragma hdrstop
#pragma argsused
//-------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
//Начальные установки
 TImage *Image1=new TImage(NULL);
 NOTIFYICONDATA tnd;
 PSTR pszTip;
 AnsiString MessageText="Формирование черно-белых списков \r\nпо услуге \"Интернет в кредит\"";
 AnsiString path;
 int pos;

 pszTip = MessageText.c_str();

 Application->Initialize();
 Application->ShowMainForm=false; //it is analog of: ShowWindow(Application->Handle,SW_HIDE);
//Если сделать Application->Minimize(), то появляется кнопка на панели 
//задач, а нам это не надо...
//Path to user-defined icon file. Application haven't default icon because
//it is coverted from Console Application and haven't main form...
 path=Application->ExeName;
 pos=path.LastDelimiter("\\");
 path=path.SubString( 1 ,pos);
 path+="FLGRUS.ICO";

//Load icon file...
 if(FileExists(path))
   Image1->Picture->Icon->LoadFromFile(path);
 else
   Image1->Picture->Icon->Handle=NULL;

//Show icon within Tray...
 tnd.cbSize          = sizeof(NOTIFYICONDATA);
 tnd.hWnd            = Application->Handle ;
 tnd.uFlags          = NIF_MESSAGE | NIF_ICON | NIF_TIP;
 tnd.hIcon           = Image1->Picture->Icon->Handle ;
 lstrcpyn(tnd.szTip, pszTip, sizeof(tnd.szTip));
 Shell_NotifyIcon(NIM_ADD,&tnd);
 Shell_NotifyIcon(NIM_MODIFY,&tnd);

 < здесь остальной код моей программы >

//Delete icon form Tray...
 Application->Terminate();
 tnd.hIcon = NULL ;
 Shell_NotifyIcon(NIM_DELETE,&tnd);
 return false;// The main form will NOT BE displayed in any cases...
}
//--------------------------------------------------------------------
С уважением,
Станислав C.

ОЧЕНЬ пригодился этот кусок кода! ...thanks за столь подробный ответ!
Хотелось бы узнать, как сделать чтобы при клике правой кнопки мыши на trayicon выскакивало popup меню. (рылся в стандартных примерах по trayicon, но запутался, хотя там это есть...)

Буду оч. признателен если напишете столь же полный и понятный ответ как выше! =))
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как запустить программу в трей? / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]