Нет такого понятия «свернуть в трей». Есть возможность только добавлять, удалять и менять значок в области трея. Сама же программа просто прячется.
Для изменения значка в трее используется класс TShellNotifyIcon модуля ShellApi
Объявим следующую процедруру:
Параметры к ней такие: n — номер операции ( 1 — добавить, 2 — удалить, 3 — заменить) и Icon — сама иконка с которой будет делаться эта операция
Procedure TForm1. Ic ( n: Integer ;Icon:TIcon ) ;
cbSize:= SizeOf ( Nim ) ;
uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
szTip:= ‘Хинт, который будет появляться у значка’ ;
Теперь, нам нужно отловить минимизацию приложения, для того, чтобы заменить стандартное действие Windows на «свёртывание в трей». Объявляем в секции protected процедуру
procedure ControlWindow ( var Msg: TMessage ) ; message WM_SYSCOMMAND;
procedure TForm1. ControlWindow ( var Msg: TMessage ) ;
if Msg. WParam = SC_MINIMIZE then
Урок на делфи 17. сворачиваем в трей
Ic ( 1 , Application. Icon ) ; // Добавляем значок в трей
ShowWindow ( Handle, SW_HIDE ) ; // Скрываем программу
Теперь нам нужно, чтобы значок в трее мог реагировать на манипуляции с ним. Если Вы внимательно посмотрите процедру Ic(), то Вы увидите там ссылку на сообщение WM_USER+1. Это не что иное, как сообщение, которое приходит нам от этого значка. Обычно для значка в трее делают всплывающее меню и выводят там те или иные действия.
Но TPopUpMenu делается обычно для правой кнопки, по левой же просто активируют приложение. На форму кидаем комопонент TPopUpMenu (пусть это будет PopUpMenu1) и заносим в него все пункты меню, которые мы хотим, чтобы онм появилис в меню, которое будет всплывать по нажатию правой кнопки на значке.
После этого описываем обработчик: В вышеназванную секцию protected добавляем ещё одну процедуру IconMouse, которая будет реагировать на сообщение WM_USER+1
protected
procedure ControlWindow ( var Msg: TMessage ) ; message WM_SYSCOMMAND;
procedure IconMouse ( var Msg: TMessage ) ; message WM_USER + 1 ;
Теперь описываем собственно процедуру.
procedure TForm1. IconMouse ( var Msg: TMessage ) ;
var p: tpoint;
begin
GetCursorPos ( p ) ; // Запоминаем координаты курсора мыши
case Msg. LParam of // Проверяем какая кнопка была нажата
WM_LBUTTONUP, WM_LBUTTONDBLCLK:
begin
Ic ( 3 , Applicattion. Icon ) ; // Удаляем зна?ок из трея
ShowWindow ( Application. Handle , SW_SHOWNORMAL ) ; // Восстанавливаем окно программы
end ;
WM_RBUTTONUP:
begin
SetForegroundWindow ( Handle ) ; // Восстанавливаем программу в ка?естве переднего окна
PopupMenu1. Popup ( p. X , p. Y ) ; // Заставляем всплыть тот самый TPopUp о котором я говорил ?уть раньше
PostMessage ( Handle, WM_NULL, 0 , 0 ) // Обнуляем сообщение
end ;
end ;
end ;
Для работы с SystemTray существует всего одна функция. Вот ее
Как свернуть программу в трей? (Видеоурок по Delphi)
Си-прототип:
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon (
DWORD dwMessage, // message identifier
PNOTIFYICONDATA pnid // pointer to structure);
Эта функция описана в заголовочном файле Win32-SDK » shellapi.h» ,
включаемом в программу при включении » windows.h» . Параметр
dwMessage может принимать одно из трех значений: NIM_ADD,
NIM_DELETE, NIM_MODIFY. Для добавления иконки он должен быть
установлен в NIM_ADD.
Параметр pnid имеет тип PNOTIFYDATA, который описан как:
typedef struct _NOTIFYICONDATA < // nid
Источник: www.delphisite.ru
Delphi как свернуть программу в трей
А ручками ?
Вот, нашел для вас у себя в архиве:
Для работы со значками в трее используется функция Shell_NotifyIcon, объявленная в модуле ShellApi.
Объявим следующую процедруру:
Параметры к ней такие: n — номер операции ( 1 — добавить, 2 — удалить, 3 — заменить) и Icon — сама иконка с которой будет делаться эта операция
Теперь, нам нужно отловить минимизацию приложения, для того, чтобы заменить стандартное действие Windows на «свёртывание в трей». Объявляем в секции protected процедуру
protected Procedure ControlWindow(Var Msg:TMessage); message WM_SYSCOMMAND; . Procedure TForm1.ControlWindow(Var Msg:TMessage); Begin IF Msg.WParam=SC_MINIMIZE then Begin Ic(1,Application.Icon); // Добавляем значок в трей ShowWindow(Handle,SW_HIDE); // Скрываем программу ShowWindow(Application.Handle,SW_HIDE); // Скрываем кнопку с TaskBar’а End else inherited; End;
Итак, теперь наш обработчик ловит сообщение о минимизации и прячет нашу прогу в трей. Однако ловит не всегда.
Попробуем, например, выбрать из системного меню команду Minimize или нажать на кнопку окна в панели задач, и что же? Не срабатывает!
Поэтому, нам нужно ещё переопределить обработчик onMinimize класса TApplication:
Procedure TForm1.OnMinimizeProc(Sender:TObject); Begin PostMessage(Handle,WM_SYSCOMMAND,SC_MINIMIZE,0); End;
и не забудем присвоить эту процедуру:
Procedure TForm1.Form1Create(Sender:TObject); Begin Application.onMinimize:=OnMinimizeProc; End;
Теперь поясню как работает. Когда приложение минимизируется, но эта минимизация не перехватывается нашим обработчиком WM_SYSCOMMAND, мы перехватываем минимизацию в процедуре OnMinimizeProc и принудительно передаём сообщение о минимизации нашей форме, где оно и будет успешно отловлено нашим обработчиком сообщения WM_SYSCOMMAND, благодаря которому прога и «сворачивается» успешно в трей и в этом случае.
Теперь нам нужно, чтобы значок в трее мог реагировать на манипуляции с ним. Если Вы внимательно посмотрите процедру Ic(), то Вы увидите там ссылку на сообщение WM_USER+1. Это не что иное, как сообщение, которое приходит нам от этого значка. Обычно для значка в трее делают всплывающее меню и выводят там те или иные действия.
Но TPopUpMenu делается обычно для правой кнопки, по левой же просто активируют приложение. На форму кидаем комопонент TPopUpMenu (пусть это будет PopUpMenu1) и заносим в него все пункты меню, которые мы хотим, чтобы онм появилис в меню, которое будет всплывать по нажатию правой кнопки на значке.
После этого описываем обработчик: В вышеназванную секцию protected добавляем ещё одну процедуру IconMouse, которая будет реагировать на сообщение WM_USER+1
protected Procedure ControlWindow(Var Msg:TMessage); message WM_SYSCOMMAND; Procedure IconMouse(var Msg:TMessage); message WM_USER+1;
Теперь описываем собственно процедуру.
procedure TForm1.IconMouse(var Msg:TMessage); Var p:tpoint; begin GetCursorPos(p); // Запоминаем координаты курсора мыши Case Msg.LParam OF // Проверяем какая кнопка была нажата WM_LBUTTONUP,WM_LBUTTONDBLCLK: Begin Ic(2,Application.Icon); // Удаляем значок из трея ShowWindow(Application.Handle,SW_SHOW); // Восстанавливаем кнопку программы ShowWindow(Handle,SW_SHOW); // Восстанавливаем окно программы End; WM_RBUTTONUP: Begin SetForegroundWindow(Handle); // Восстанавливаем программу в качестве переднего окна PopupMenu1.Popup(p.X,p.Y); // Заставляем всплыть тот самый TPopUp о котором я говорил чуть раньше PostMessage(Handle,WM_NULL,0,0); end; End; end;
Для выполнения пунктов всплывающего меню, пишите стандартные обработчики onClick() для его пунктов.
Delphi как свернуть программу в трей
Кидаем на форму button,
компонент ttrayicon, Скрин
компонент ApplicationEvents Скрин
Для начала нам нужно свернуть программу в трей, и разворачивать ее отттуда.
В компоненте applicationevents выбираем событие onminimize (Скрин)
и пишем следующий код:
procedure TForm1.ApplicationEvents1Minimize(Sender: TObject); begin TrayIcon1.visible:=true; //Убираем с панели задач ShowWindow(Handle,SW_HIDE); // Скрываем программу ShowWindow(Application.Handle,SW_HIDE); // Скрываем кнопку с TaskBar’а SetWindowLong(Application.Handle, GWL_EXSTYLE, GetWindowLong(Application.Handle, GWL_EXSTYLE) or (not WS_EX_APPWINDOW)); end;
Результат выполнения этого куска кода: при минимизации формы, в трее появится значок программы, и форма исчезнет.
Чтобы вернуть форму на экран, напишем следующий код:
procedure TForm1.TrayIcon1DblClick(Sender: TObject); begin TrayIcon1.ShowBalloonHint; ShowWindow(Handle,SW_RESTORE); SetForegroundWindow(Handle); TrayIcon1.Visible:=False; end;
Результат выполнения этого куска кода: по двойному клику по иконке в трее, форма вернется на экран, а значок исчезнет из трея.
Теперь научим программу посылать нам уведомления. Рассмотрим на примере кнопки:
procedure TForm1.Button2Click(Sender: TObject); begin TrayIcon1.visible:=true; // делаем значок в трее видимым trayicon1.balloontitle:=(‘Текст 1’); trayicon1.balloonhint:=(‘Текст 2’); trayicon1.showballoonHint;// показываем наше уведомление end;
Что у нас примерно получится:
[ Ссылки могут видеть только зарегистрированные пользователи. ]
Статья писалась РОСПОТРЕБНАДЗОР’ом специально для zhyk.ru
При копировании указывать ссылку на эту тему.
Спасибо за внимание.
Источник: zhyk.org