![]() |
|
|
|
|
#1
|
|||
|
|||
|
Как сваять иконку в трее? т.е. не сваять ее а как сделать так шоб прога тама сидела? И еще шоб она не показывалась в области задачЪ?
|
|
#2
|
||||
|
||||
|
Вот. Насчёт нужности всех uses'ов не уверен. просто у меня так в одной проге.
Код:
uses messages, AppEvnts, Messages, Controls,...
...
const WM_MYICONNOTIFY = WM_USER + 123;
type
TForm1 = class(TForm)
...
PopupMenu1: TPopupMenu;
...
public
{ Public declarations }
procedure WMICON(var msg: TMessage); message WM_MYICONNOTIFY;
procedure WMSYSCOMMAND(var msg: TMessage);message WM_SYSCOMMAND;
procedure RestoreMainForm;
procedure HideMainForm;
procedure CreateTrayIcon(n:Integer);
procedure DeleteTrayIcon(n:Integer);
...
uses ComObj, ShellApi,...
procedure TForm1.WMICON(var msg: TMessage);
var P : TPoint;
nidata : TNotifyIconData;
begin
case msg.LParam of
WM_LBUTTONDOWN, WM_RBUTTONDOWN:
begin
GetCursorPos(p);
SetForegroundWindow(Application.MainForm.Handle);
PopupMenu1.Popup(P.X, P.Y);
end;
WM_LBUTTONDBLCLK : begin
RestoreMainForm;
DeleteTrayIcon(1);
SetForeGroundWindow(Application.MainForm.Handle);
SetActiveWindow(Application.MainForm.Handle);
end;
WM_MOUSEMOVE: begin
with nidata do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := Self.Handle;
uID := 1;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage := WM_MYICONNOTIFY;
hIcon := Application.Icon.Handle;
StrPCopy(szTip,Application.Title+'текст всплывающей подсказки');
end;
Shell_NotifyIcon(NIM_MODIFY, @nidata);
end;
end;
end;
procedure TForm1.WMSYSCOMMAND(var msg: TMessage);
begin
inherited;
if (Msg.wParam=SC_MINIMIZE) then begin
HideMainForm;
CreateTrayIcon(1);
end;
end;
procedure TForm1.HideMainForm;
begin
Application.ShowMainForm := False;
ShowWindow(Application.Handle, SW_HIDE);
ShowWindow(Application.MainForm.Handle, SW_HIDE);
end;
procedure TForm1.RestoreMainForm;
var i,j : Integer;
begin
Application.ShowMainForm := True;
ShowWindow(Application.Handle, SW_RESTORE);
ShowWindow(Application.MainForm.Handle, SW_RESTORE);
if not ShownOnce then
begin
for I := 0 to Application.MainForm.ComponentCount -1 do
if Application.MainForm.Components[i] is TWinControl then
with Application.MainForm.Components[i] as TWinControl do
if Visible then
begin
ShowWindow(Handle, SW_SHOWDEFAULT);
for J := 0 to ComponentCount -1 do
if Components[J] is TWinControl then
ShowWindow((Components[J] as TWinControl).Handle, SW_SHOWDEFAULT);
end;
ShownOnce := True;
end;
end;
procedure TForm1.CreateTrayIcon(n:Integer);
var nidata : TNotifyIconData;
begin
with nidata do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := Self.Handle;
uID := 1;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage := WM_MYICONNOTIFY;
hIcon := Application.Icon.Handle;
StrPCopy(szTip,Application.Title+'текст всплывающей подсказки');
end;
Shell_NotifyIcon(NIM_ADD, @nidata);
end;
procedure TForm1.DeleteTrayIcon(n:Integer);
var nidata : TNotifyIconData;
begin
with nidata do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := Self.Handle;
uID := 1;
end;
Shell_NotifyIcon(NIM_DELETE, @nidata);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ShownOnce:= False;
CreateTrayIcon(1);
{HideItem.Enabled := False;}
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
DeleteTrayIcon(1);
end;Вот так вот не просто. Дело в том, что в виндах нет понятия свернуть прогу в трей. Есть просто процедуры создания иконки в трее и прятания главной формы. |
|
#3
|
|||
|
|||
|
Все кульно прилепил к своей прожке, пашет. Пасибы!
PS: Кстать из юзесов окромя стандартных понадобился тока ShellApi. Последний раз редактировалось Unocide, 24.11.2005 в 15:43. |
|
#4
|
|||
|
|||
|
Работает все отлично, только надо добавить переменную:
Код:
... private ShownOnce:boolean; ... |