Вот 100%-работающий пример. Сравни со своим кодом...
| Код | unit ufIconTray;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Menus, ShellApi,dialogs;
var WM_MyNotifyIcon: Cardinal;
type
TfIconTray = class(TForm)
//PopUp-меню, всплывающее при клике на иконку pmIconTray: TPopupMenu;
//Пункты меню pmIconTrayRestore: TMenuItem; //Восстановление приложения pmIconTrayExit: TMenuItem; //Завершение программы pmIconTrayNoAction: TMenuItem; //Фиктивный пункт меню
procedure FormCreate(Sender: TObject); procedure IconTray(aAction: Cardinal); //Процедура для манипуляций с иконкой в SysTray procedure pmIconTrayRestoreClick(Sender: TObject); procedure pmIconTrayExitClick(Sender: TObject); procedure MyWndProc(var Message: TMessage); procedure FormShow(Sender: TObject); end;
var fIconTray: TfIconTray;
implementation
{$R *.dfm}
procedure TfIconTray.FormCreate(Sender: TObject); var UniqueStr: String; begin Application.Title := Self.Caption; UniqueStr := Application.Title+IntToStr(Application.Handle); //Получаем уникальный номер Windows-сообщения. WM_MyNotifyIcon := RegisterWindowMessage(PChar(UniqueStr)); //Заменяем обработчик стандартный обработчик сообщений на наш WindowProc := MyWndProc; // Application.OnMinimize := AppOnMinimize; end;
procedure TfIconTray.MyWndProc(var Message: TMessage); var P: TPoint; begin //Обработка сообщения от иконки в SysTray if Message.Msg = WM_MyNotifyIcon then begin case Message.LParam of
WM_LBUTTONDBLCLK : begin //Восстанавливаем приложение ShowWindow(Application.Handle,SW_RESTORE); //Восстанавливаем основную форму ShowWindow(Application.MainForm.Handle,SW_RESTORE); //Приложение - на передний план SetForegroundWindow(Application.MainForm.Handle); //Удаляем иконку IconTray(NIM_DELETE); end; //Клик на правой кнопке мыши WM_RBUTTONUP: begin //Считываем позицию курсора на экране GetCursorPos(P); //Показываем меню в позиции курсора SetForegroundWindow(Application.MainForm.Handle); pmIconTray.Popup(P.X, P.Y); end; end; //Заканчиваем обработку Message.Result := 0; Exit; end; //Обработка нажатия на кнопку свернуть в заголовке окна
if (Message.Msg=WM_SYSCOMMAND) and (Message.wParam = SC_MINIMIZE) then begin //Добавляем иконку IconTray(NIM_ADD); //Скрываем основную форму ShowWindow(Application.MainForm.Handle,SW_HIDE); //Скрываем приложение ShowWindow(Application.Handle,SW_HIDE); //Заканчиваем обработку Message.Result := 0; Exit; end; //Не наше сообщение - вызываем стандартную процедуру окна WndProc(Message); end;
//Процедура для манипуляций с иконкой procedure TfIconTray.IconTray(aAction: Cardinal); var nid: TNotifyIconData; begin //Заполнение структуры nid.cbSize := SizeOf(TNotifyIconData); //Размер структуры nid.Wnd := Self.Handle; //Окно назначения nid.uID := 0; //Назначаем идентификатор иконке nid.uCallBackMessage := WM_MyNotifyIcon; //Процедура для обработки сообщений nid.hIcon := Application.Icon.Handle; //Это основная иконка приложения StrPCopy(nid.szTip,Application.Title); //Всплывающая подсказка (Hint) //Признаки: // NIF_ICON - используется поле nid.hIcon // NIF_MESSAGE - используется сообщение с номером nid.uCallBackMessage для обработки // NIF_TIP - для иконки назначен Hint - всплывающая подсказка. nid.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP; case aAction of NIM_ADD: Shell_NotifyIcon(NIM_ADD, @nid); //Добавление иконки NIM_DELETE: Shell_NotifyIcon(NIM_DELETE, @nid); //Удаление иконки NIM_MODIFY: Shell_NotifyIcon(NIM_MODIFY, @nid); //Модификация иконки end; end;
//Обработка при выборе пункта меню "Восстановить" procedure TfIconTray.pmIconTrayRestoreClick(Sender: TObject); begin //Посылаем нашему окну сообщение WM_LBUTTONDBLCLK PostMessage(Application.MainForm.Handle,WM_MyNotifyIcon,0,WM_LBUTTONDBLCLK); end;
//Обработка при выборе пункта меню "Выход из программы" procedure TfIconTray.pmIconTrayExitClick(Sender: TObject); begin //Посылаем нашему окну сообщение WM_LBUTTONDBLCLK PostMessage(Application.MainForm.Handle,WM_MyNotifyIcon,0,WM_LBUTTONDBLCLK); //Закрываем приложение Application.MainForm.CLose; end;
procedure TfIconTray.FormShow(Sender: TObject); begin if not Boolean(Tag) then begin Form2.Show; Tag := 1; end; end;
end.
|
|