![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Системный трей [D7, XP]
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