Вот пример. В нем я сделал только сворачивание главной формы, без сворачивания остальных.
| Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, TrayIcon;
type TForm1 = class(TForm) private procedure WMTRAY_MAINICON(var Mes: Messages.TMessage); message WM_TRAYICON + MAIN_ICON; procedure OnMinimize(var Mes: Messages.TMessage); message WM_SYSCOMMAND; public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.OnMinimize(var Mes: Messages.TMessage); begin if Mes.WParam = SC_MINIMIZE then begin Hide; ShowWindow(Application.Handle, SW_HIDE); AddIcon(MAIN_ICON, Form1.Icon.Handle, Form1.Caption); end else inherited; end;
procedure TForm1.WMTRAY_MAINICON(var Mes: Messages.TMessage); begin case Mes.LParam of WM_LBUTTONDBLCLK: begin Show; ShowWindow(Application.Handle, SW_SHOW); SetForegroundWindow(Handle); DeleteIcon(MAIN_ICON); end; end; end;
end. |
Вот модуль для работы с иконкой.| Код | unit TrayIcon;
interface
uses Windows, Messages, ShellAPI, Forms;
const WM_TRAYICON = WM_APP + 1; MAIN_ICON = 1;
procedure AddIcon(ID: byte = MAIN_ICON; IcoN: HIcon = 0; Tip: string = ''); {* Добавляет иконку в трей. На входе: ID - id иконки (def = MAIN_ICON); IcoN - номер иконки в exe (def = 0) или hIcon нужной иконки Tip - Hint на иконе (def = '') }
procedure DeleteIcon(ID: byte = MAIN_ICON); {* Убивает икону в трее. На входе: ID - id иконки (def - ) }
procedure ModifyIcon(ID: byte = MAIN_ICON; IcoN:HIcon=0;Tip:string=''); {* Изменяет параметры иконы - иконку и/или хинт. На входе то же, что и AddIcon }
implementation
type PNotifyIconData = ^TNotifyIconData; TNotifyIconData = record cbSize: DWORD; Wnd: HWND; uID: UINT; uFlags: UINT; uCallbackMessage: UINT; hIcon: HICON; szTip: array [0..63] of AnsiChar; end;
function Shell_NotifyIcon(dwMessage: DWORD; lpData: PNotifyIconData): BOOL; stdcall; external 'shell32.dll' name 'Shell_NotifyIconA';
function TaskBarAddIcon(hWindow: HWND; ID: Cardinal; ICON: hIcon; CallbackMessage: Cardinal; Tip: PChar): Boolean; var NID: TNotifyIconData; begin FillChar(NID, SizeOf(TNotifyIconData), 0); with NID do begin cbSize := SizeOf(TNotifyIconData); Wnd := hWindow; uID := ID; uFlags := 7; // MESSAGE or ICON or TIP uCallbackMessage := CallbackMessage; hIcon := Icon; lstrcpyn(szTip, Tip, SizeOf(szTip)); end; Result := Shell_NotifyIcon(0, @NID); // AddIcon end;
function TaskBarDeleteIcon(hWindow: HWND; ID: Integer): Boolean; var NID: TNotifyIconData; begin FillChar(NID, SizeOf(TNotifyIconData), 0); with NID do begin cbSize := SizeOf(TNotifyIconData); Wnd := hWindow; uID := ID; end; Result := Shell_NotifyIcon(2, @NID); // DeleteIcon end;
function TaskBarModifyIcon(hWindow: HWND; ID: Cardinal; Flags: Cardinal; ICON: hIcon; Tip: PChar): Boolean; var NID: TNotifyIconData; begin FillChar(NID, SizeOf(TNotifyIconData), 0); with NID do begin cbSize := SizeOf(TNotifyIconData); Wnd := hWindow; uID := ID; uFlags := Flags; hIcon := Icon; lstrcpyn(szTip, Tip, SizeOf(szTip)); end; Result := Shell_NotifyIcon(1, @NID); end;
procedure AddIcon(ID:byte=MAIN_ICON;IcoN:HIcon=0;Tip:string=''); var h: hIcon; begin if IcoN < 10 then h := ExtractIcon(hInstance, PChar(ParamStr(0)), IcoN) else h := IcoN; if h <> 0 then TaskBarAddIcon(Application.MainForm.Handle, ID, h, WM_TRAYICON + ID, PChar(Tip)); end;
procedure DeleteIcon(ID: byte = MAIN_ICON); begin TaskBarDeleteIcon(Application.MainForm.Handle, ID); end;
procedure ModifyIcon(ID: byte = MAIN_ICON; IcoN:HIcon=0;Tip:string=''); const NIF_ICON = $00000002; NIF_TIP = $00000004; var h: hIcon; begin if IcoN < 10 then h := ExtractIcon(hInstance, PChar(ParamStr(0)), IcoN) else h := IcoN; if h <> 0 then TaskBarModifyIcon(Application.MainForm.Handle, ID, NIF_ICON, h, PChar(Tip)); end;
end. |
Причем иконок может быть много - хоть по одной на каждую форму. Только ID им разный задавай. |