СообЧа > База Знаний > Программирование > Delphi

Вопрос

Как заставить программу спрятаться в TRAY (там, где часики)?

Ответ

Ни в Delphi, ни где-либо еще нельзя «свернуть» или «спрятать» приложение в трей. На самом деле происходит следующее: программа добавляет иконку в трей, а сама становится невидимой.

1. Способ, основанный на использовании компонента TRxTrayIcon из RxLib:
Со страницы Rx Tools берешь RxTrayIcon. Выбираешь иконку для статического отображения или для анимированной картинки. Пишешь код примерно такой:

interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, RXShell;
type
TForm1 = class(TForm)
RxTrayIcon1: TRxTrayIcon;
procedure FormCreate(Sender : TObject);
procedure RxTrayIcon1DblClick(Sender: TObject);
procedure FormShow(Sender: TObject);
private
procedure ApplicationMinimize(Sender : TObject);
procedure ApplicationRestore(Sender : TObject);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
RXTrayIcon1.Icon:=Application.Icon; //Присваиваем икону от приложения
Application.OnMinimize := ApplicationMinimize; // Описываем обработчики
Application.OnRestore := ApplicationRestore; // событий
end;

procedure TForm1.ApplicationMinimize(Sender : TObject);
begin
ShowWindow(Application.Handle, SW_HIDE); // Скрываем прямоугольник в Task Bar
end;

procedure TForm1.ApplicationRestore(Sender : TObject);
begin
ShowWindow(Application.Handle, SW_HIDE); // Скрываем прямоугольник в Task Bar
end;

procedure TForm1.RxTrayIcon1DblClick(Sender: TObject);
begin
Application.Restore; // Восстанавливаем
Application.BringToFront; // Выносим вперед
end;

procedure TForm1.FormShow(Sender: TObject);
begin
ShowWindow(Application.Handle, SW_HIDE); // Скрываем прямоугольник в Task Bar
end;


2. Для добавления иконки нужно пользоваться ф-ией Shell_NotifyIcon. Она очень простая:

WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage, // message identifier
PNOTIFYICONDATA pnid // pointer to structure
);
dwMessage может принимать сл. значения:
NIM_ADD Добавить иконку в трей
NIM_DELETE Удалить иконку из трея
NIM_MODIFY Изменить свойства иконки в трее
Второй параметр pnid содержит тип NOTIFYICONDATA:
typedef struct _NOTIFYICONDATA { // nid
DWORD cbSize; // на практике это SizeOf(IconData)
HWND hWnd; // хэндл главного окна твоего приложения
UINT uID; // на практике — $DEDB
UINT uFlags; // ставь NIF_MESSAGE or NIF_ICON or NIF_TIP
UINT uCallbackMessage; // идентификатор сообщения, которое
// будет получать твое приложение при «колдовании»
// пользователя над иконкой в трее. Забей как константу,
// например, WM_MyIcon = WM_USER + 1
HICON hIcon; // хэндл иконки, например,
// application.Icon.Handle
char szTip[64]; // текст всплывающей подсказки
} NOTIFYICONDATA, *PNOTIFYICONDATA;


Все. Осталось только ловить сообщения.

Олег Анатольевич

www.listplayer.narod.ru
Там и статья, как это сделать, и компонент есть.

fse



Copyright © 2000-2004 Сообщество Чайников
Контактная информация