Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Системный трей [D7, XP]


Страницы:   1 2 3 4

DimOk ©   (2007-08-29 09:39:00) 

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


Человек   (2007-08-29 11:00:00) [41]


> DimOk ©   (29.08.07 10:56) [28]
</I
> А пояснить можно......?

>

Не обращай внимания


DimOk   (2007-08-29 10:56:00) [42]


> Все равно надо кончать на месте и афтаров этих вопросов,
>  и тех, кто им дает правильные ответы - за вред, который
> они наносят эволюции человечества

А пояснить можно......?


DrPass   (2007-08-29 10:52:00) [43]


> Ну наконец то, а то я думал, что с выходом Д2006 эти вопросы
> канули в небытие

Все равно надо кончать на месте и афтаров этих вопросов, и тех, кто им дает правильные ответы - за вред, который они наносят эволюции человечества


DimOk   (2007-08-29 10:44:00) [44]

Вот код:
//////////////////////////////////////////////////////////////////
/////////////////// tray icons ///////////////////////////////////
//////////////////////////////////////////////////////////////////

function AddTrayIcon(wHandle : THandle; Const IconName, Hint : String;
                    PopupMenuStrings : array of String;
                    TrayEventProc : TTrayEventProc = nil): Boolean;
Var n,m,i,c : Integer;
   s : String;
begin
TrayIcon.cbSize := SizeOf(TrayIcon);
TrayIcon.Wnd := wHandle;
TrayIcon.uID := 100;
TrayIcon.uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
TrayIcon.uCallbackMessage := WM_MYTRAYMSG;
TrayIcon.hIcon :=LoadIcon(hInstance, PChar(IconName));
Move(PChar(Hint)^,TrayIcon.szTip,Length(Hint));
TrayEnabled:=Shell_NotifyIcon(NIM_ADD,@TrayIcon);
Result:=TrayEnabled;

TrayProc:=TrayEventProc;

MItemCount:=Length(PopupMenuStrings);
If (TrayEnabled) and (MItemCount>0) then begin
 PopupMenu:=CreatePopupMenu;
 SetLength(MenuKeys,MItemCount);
 i:=0;
 For n:=0 to MItemCount-1 do begin
   MenuKeys[n]:=0;
   If PopupMenuStrings[n]='-' then AppendMenu(PopupMenu,MF_SEPARATOR,0,nil)
     else begin
       s:=PopupMenuStrings[n]; m:=Pos('[',s);
       If m<>0 then begin
         Val(Copy(s,m+1,Length(s)-m-1),MenuKeys[n],c);
//          MenuKeys[n]:=Str_2Num(Copy(s,m+1,Length(s)-m-1));
         Delete(s,m,Length(s)-m+1);
       end;

       AppendMenu(PopupMenu,0,n,PChar(s));

       Inc(i);
     end;
 end;
end;
end;
Надеюсь автор не будет предъявлять претензий, эту прогу я скачивал из роздела "Статьи" этого сайта.


DimOk   (2007-08-29 10:34:00) [45]

К стати я сейчас вспомнил, что скачивал программу DesctopFire там есть реализация функций связанных с системным трейем. Надо посмотреть исходник :)


@!!ex   (2007-08-29 10:34:00) [46]

> Но есть простые задачи, для решения которых нет необходимости
> использовать WinAPI и раздувать код программы.

Бугага. ЛОл.


DimOk   (2007-08-29 10:32:00) [47]


> Видимо у него форма есть :)

А как ты догадался :)


DimOk   (2007-08-29 10:31:00) [48]


> Компонеты - путь ламеров. ИМХО ИМХО ИМХО ИМХО ИМХО
> Что будешь делать, есть у проги не будет формы? Скажем все
> на WinAPI.

Я понимаю, поэтому мне интересны все варианты, спасибо за помощь.
Компоненты  - это как MathCad Умного делает умнее, а глупого глупее.... :)
Я думаю их стоит использовать с достаточно большим занием методик программирования. Но есть простые задачи, для решения которых нет необходимости использовать WinAPI и раздувать код программы.


Человек   (2007-08-29 10:28:00) [49]


> @!!ex ©   (29.08.07 10:24) [20]


Видимо у него форма есть :)


@!!ex   (2007-08-29 10:24:00) [50]

> [18] DimOk ©   (29.08.07 10:22)

Компонеты - путь ламеров. ИМХО ИМХО ИМХО ИМХО ИМХО
Что будешь делать, есть у проги не будет формы? Скажем все на WinAPI.


@!!ex   (2007-08-29 10:23:00) [51]

Упс. Косяк в моем сообщении.
Правильно так:
Вот это будет обрабатывать сообщения иконки:
procedure WMICON(var msg:TMessage);
message WM_User;


У меня обработка выглядит так:
procedure TQuestionForm.WMICON(var msg: TMessage);
var
Point:TPoint;
begin
if (Msg.LParam=WM_LBUTTONDOWN) or (Msg.LParam=WM_RBUTTONDOWN) then
begin
 GetCursorPos(Point);
 PopupMenu1.Popup(Point.x,Point.y);
end;
end;


P.S.
забыл сказать, в качестве иконок используется те, что находяться в ресурсах exe шникак.
Функцию для открытия иконки из файла напишешь сам, если оно тебе надо, лично я с такой необходимостью не встречался.


DimOk   (2007-08-29 10:22:00) [52]

Хотя abfComponents на все 200% делает этузадачу и многие другие, как я уже вижу :)


DimOk   (2007-08-29 10:21:00) [53]


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

Я это понял. Окно достаточно скрывать по определенному событию..


DimOk   (2007-08-29 10:19:00) [54]

Всем большое спасибо, буду переваривать :)


@!!ex   (2007-08-29 10:17:00) [55]

P.P.S.
Действительно. И мой код тоже не сворачивает приложение в трей.
Он лишь позволяет создать в трее иконку.
А уж куда ты будешь сворачивать приложение, это твое дело, трэй тут ни при чем.


@!!ex   (2007-08-29 10:16:00) [56]

unit TrayUnit;

interface

uses
 Windows, Messages;

const
 WM_IconMessage=WM_User;
var  
 Handle:integer=0;

procedure TrayCreate(const i,N:string);overload;
procedure TrayModify(const i,N:string);overload;
procedure TrayCreate(I:integer;const N:string);overload;
procedure TrayModify(I:integer;const N:string);overload;
procedure TrayDelete;

implementation

uses ShellAPI;

function StrCopy(Dest: PChar; const Source: PChar): PChar; assembler;
asm
       PUSH    EDI
       PUSH    ESI
       MOV     ESI,EAX
       MOV     EDI,EDX
       MOV     ECX,0FFFFFFFFH
       XOR     AL,AL
       REPNE   SCASB
       NOT     ECX
       MOV     EDI,ESI
       MOV     ESI,EDX
       MOV     EDX,ECX
       MOV     EAX,EDI
       SHR     ECX,2
       REP     MOVSD
       MOV     ECX,EDX
       AND     ECX,3
       REP     MOVSB
       POP     ESI
       POP     EDI
end;

var
 nid: TNotifyIconData;

procedure TrayCreate(I:integer;const N:string);
begin
 nid.cbSize := sizeof (nid);
 nid.wnd := Handle;
 nid.uID := 1; // icon ID
 nid.uCallBAckMessage := WM_IconMessage;
 nid.hIcon := LoadIcon(HInstance,MakeIntResource(I));
 strcopy (nid.szTip, PChar(N));
 nid.uFlags := 7;
 Shell_NotifyIcon (0, @nid);
end;

procedure TrayModify(I:integer;const N:string);
begin
 nid.hIcon := LoadIcon(HInstance,MakeIntResource(I));;
 strcopy (nid.szTip, PChar(N));
 nid.uFlags := 6;
 if Shell_NotifyIcon(1, @nid) then
  TrayCreate(i,N);
end;

procedure TrayCreate(const i,N:string);
begin
 nid.cbSize := sizeof (nid);
 nid.wnd := Handle;
 nid.uID := 1; // icon ID
 nid.uCallBAckMessage := WM_IconMessage;
 nid.hIcon := LoadIcon(HInstance,PChar(I));
 strcopy (nid.szTip, PChar(N));
 nid.uFlags := 7;
 Shell_NotifyIcon (0, @nid);
end;

procedure TrayModify(const i,N:string);
begin
 nid.hIcon := LoadIcon(HInstance,PChar(I));;
 strcopy (nid.szTip, PChar(N));
 nid.uFlags := 6;
 if Shell_NotifyIcon(1, @nid) then
  TrayCreate(i,N);
end;

procedure TrayDelete;
begin
 nid.uFlags := 0;
 Shell_NotifyIcon (2, @nid);
end;

end.

Это модуль для запуздыривания иконки туда, где часики.

Для того, чтобы работать с ним, нужно в одной из форм прописать:
TRayUnit.Handle:=Form.Handle;
указанная форма будет получать сообщения, которые будут генериться иконкой в трее.
Не забывай удалять иконки в конце работы, иначе после закрытия иконка останется в трее и умрети только при наведении мыши(иконка также будет умирать, если не указать окно для приема сообщение).

Вот это будет обрабатывать сообщения иконки:
procedure WMICON(var msg:TMessage);

У меня обработка выглядит так:
procedure TQuestionForm.WMICON(var msg: TMessage);
var
Point:TPoint;
begin
if (Msg.LParam=WM_LBUTTONDOWN) or (Msg.LParam=WM_RBUTTONDOWN) then
 begin
  GetCursorPos(Point);
  PopupMenu1.Popup(Point.x,Point.y);
 end;
end;

P.S.
забыл сказать, в качестве иконок используется те, что находяться в ресурсах exe шникак.
Функцию для открытия иконки из файла напишешь сам, если оно тебе надо, лично я с такой необходимостью не встречался.
 message WM_User;


Rouse_   (2007-08-29 10:15:00) [57]


> DimOk ©   (29.08.07 10:10) [12]
>
> > Никак.
>
> [5]

Этот код не сворачивает программу в системный трей :)


DimOk   (2007-08-29 10:10:00) [58]


> Никак.

[5]


DimOk   (2007-08-29 10:09:00) [59]


> Ну наконец то, а то я думал, что с выходом Д2006 эти вопросы
> канули в небытие.

Delphi 7 :)


Сергей М.   (2007-08-29 10:08:00) [60]


> как программу свернуть в системный трей


Никак.


> Undeclared identifier: 'TNotifyIconData'


uses ShellAPI


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо