Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Свернуть прогу в Tray


Автор: brick-rs 20.5.2004, 05:31
как сей сабж реализовать, кстати в факе щелкал по ссылке выходит: Object not found!

Автор: jonik_Dk 20.5.2004, 09:31
Есть компоненты Rx.

Компонентик RxTrayIcon кидаешь минимум настроек и все работает.

Автор: brick-rs 20.5.2004, 09:56
минумиум настроек сделал, но заблудился в ссылках, как отловить минимизацию окна?
Нешел следующее:

>>"Обработка сообщения WM_SYSCOMMAND (перехват минимизации окна)"
>>Procedure TMain.WMGetSysCommand(var Message : TMessage) ;
>>Begin
>>IF (Message..wParam = SC_MINIMIZE)
>>Then Main.Visible:=False
>>Else Inherited;
>>End;

где это и куда это?

Автор: p0s0l 20.5.2004, 16:16
Код
interface
...

type
 TMain = class(TForm)
...
   procedure WMGetSysCommand(var Message : TMessage); message WM_SYSCOMMAND;
...

implementation

procedure TMain.WMGetSysCommand(var Message : TMessage);
begin
... далее по тексту как ты привел
end;

Автор: Cyber_Master 20.5.2004, 16:20
Это всё хорошо, но как вызывать контекстное меню по правой кнопке мыши на иконке в Трее ?

Автор: functionario honorifico 20.5.2004, 16:26
При вызове Sell_NotifyIcon ты
передаёшь ей идентификатор колбэк-сообщения.
Соответственно в его обработчике

if Msg.lParam = WM_RBUTTONDOWN then
begin
GetCursorPos(P);
PopupMenu.Popup(P.X, P.Y);
end;

Автор: p0s0l 20.5.2004, 16:29
functionario honorifico, почему бы не зарегистрироваться ? ;)

Автор: brick-rs 21.5.2004, 03:23
Вроде бы получилось, но вот еще не совсем, с кнопки минимизации все Ок, а если нажимаешь на панели задач на программу, чтоб она свернулась, то она не сворачивается, я так предполагаю это что другое событие? как сие отловить и все таки "загнать" прогу в трей?

Автор: functionario honorifico 21.5.2004, 16:48
Воспользуйся Application.OnMinimize

(в этом случае сообщение WM_SYSCOMMAND направляется не форме,
а непосредственно Application. Естественно, что в обработчик сообщения формы
оно не попадает)


Автор: SkilFul 22.5.2004, 19:13
Вот текст, который я использовал, устранив ошибки ...

Код

uses ShellApi


В место где пишут процедуры
Код

  Procedure Ic(n:Integer;Icon:TIcon);


Добавляем в protected (после обычных процедур)
Код

protected
Procedure ControlWindow(Var Msg:TMessage)
; message WM_SYSCOMMAND;
Procedure IconMouse(var Msg : TMessage)
; message WM_USER+1;


Перехват сообщений о свертывании
Код

Procedure TForm1.ControlWindow(Var Msg:TMessage);
Begin
IF Msg.WParam=SC_MINIMIZE then
Begin
Ic(1,i1.Picture.Icon); //Добавляем значок в трей
ShowWindow(Handle,SW_HIDE);
ShowWindow(Application.Handle,SW_HIDE);
save.trayin:=true;
// Скрываем программу
End
else
inherited;
End;


Процедура работы со значками
Код

Procedure TForm1.Ic(n:Integer;Icon:TIcon);
Var Nim:TNotifyIconData;  fl:string;
begin
With Nim do
Begin
cbSize:=SizeOf(Nim);
Wnd:=Form1.Handle;
uID:=1;
uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
hicon:=Icon.Handle;
uCallbackMessage:=wm_user+1;
szTip:='IP Messenger v8.5';
End;
Case n OF
1: Shell_NotifyIcon(Nim_Add,@Nim); //добавление
2: Shell_NotifyIcon(Nim_Delete,@Nim); //удаление
3: Shell_NotifyIcon(Nim_Modify,@Nim); //изменение
End;
end;


Действия при нажатии на значок в трее
Код

procedure TForm1.IconMouse(var Msg:TMessage);
Var p:tpoint;
begin
GetCursorPos(p); //запоминаем координаты курсора мыши
Case Msg.LParam OF //проверяем какая кнопка была нажата
WM_LBUTTONUP,WM_LBUTTONDBLCLK: {действия, происходящие по щелчку и нажатию левой кнопки мыши}
Begin
Ic(2,i1.Picture.Icon); // удаляем значок из трея
ShowWindow(Handle,sw_SHOWNORMAL); // вот та самая ошибка (я её сам заметил) если не написать эту срточку, окно свернется только в ...
ShowWindow(Application.Handle,SW_SHOWNORMAL)
;
End;
WM_RBUTTONUP: {при нажатии правой  кнопкой мыши}
Begin
SetForegroundWindow(Handle)
;
PopupMenu5.Popup(p.X,p.Y)
; // выводим POPUP
PostMessage(Handle,WM_NULL,0,0);
//восстанавливаем окно программы
end;
End;
end;



Всё отлично работает
(Отредактированный ответ Song)
После введения этого текста при свертывании программа будет сворачиваться в ТРеЙ.

Автор: x77 22.5.2004, 19:28
1. " Вот текст, который я использовал, устранив ошибки ..."

2. "(Отредактированный ответ Song)"

ты за Song'ом "устранял ошибки" ? да ты крут, брат. хрен с ней, с репутацией, но мне дико любопытно, что именно ты устранил из корявок бедолаги Song'а?

Автор: Pathfider 17.7.2004, 17:34
SkilFul С этим кодом действительно все классно работает! Правда пришлось его малясь подправить для своего случая. Спасибо!

Автор: sergejzr 25.9.2004, 00:15
Цитата(SkilFul @ 22.5.2004, 18:13)
Ic(1,i1.Picture.Icon); //Добавляем значок в трей


что значит тут i1 ?

А, разобрался, Это TImage.
А вот этот save?

Код
save.trayin:=true;


Всё, спасиб разобрался smile.gif

значит добавлю:
i1 это TImage с иконкой в трее. Там формат должен быть *.ico иначе не идёт smile.gif для теста можно взять прицепленный.

Необходимо добавить pop up menu "PopupMenu5" в вашу форму.

Код
save.trayin:=true;
Это походу можно закомментировать. Просто переменная, которая знает втрее ли программа smile.gif

Вроде теперь должно работать smile.gif


Автор: The MASTER 28.9.2004, 19:17
Слушай легче короче скачать хороший Набор компонентов CHPACK если бы у меня был бы сайт я бы тебе ссылочку на скачку дал бы а так поищи на Яndex там так и пиши Пакет компонентов CHPACK и там и в трей сворачивать и у панелий появились события OnMouseOver и т.д...

CHPACK For DELPHI Рекомендованно THE MASTER'ом!

Автор: Medved 29.9.2004, 00:04
Специально для The MASTER: http://russian.joelonsoftware.com/Articles/LeakyAbstractions.html

Автор: The MASTER 30.9.2004, 06:29
Что это Pegas?

Автор: brick-rs 30.9.2004, 06:38
The MASTER как что, прикольная тема, ты статьи читал? почитай для тебя будет полезно, именно это Pegas и имел ввиду.
Pegas-у спасибо за ссылку, много полезного подчеркнул, во многих статьях.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)