Преамбулаобщением с панелью задач занимается процедурина из Windows API, именуемая
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage, // идентификатор сообщения
PNOTIFYICONDATA pnid // указатель на структуру данных
);
Параметры
dwMessage - идентификатор сообщения, принимает следующие значения:
NIM_ADD добавляет иконку
NIM_DELETE убирает иконку
NIM_MODIFY чтобы вы думали?! - модифицирует иконку
pnid указатель на структуру NOTIFYICONDATA, содержание которой зависит от значения dwMessage.
смотрим на саму структуру:
typedef struct _NOTIFYICONDATA { // nid
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
char szTip[64];
} NOTIFYICONDATA, *PNOTIFYICONDATA;
Поля записи:
cbSize - размер структуры NOTIFYICONDATA
hWnd - Handle окна, которое будет получать сообщения от иконки в таскбаре
uID - идентификатор иконки, определяется программой и в рамках одной программы должен быть уникальным (если иконок много)
uFlags - набор флагов, показывающий, какие поля были заданы. является комбинацией (читай - суммой) следующих значений:
NIF_ICON передан дескриптор иконки
NIF_MESSAGE назначена callback-функция
NIF_TIP назначена подсказка
uCallbackMessage - это код сообщения, которое будет отсылаться форме, (той самой, Handle которой мы указали в hWnd), каждый раз, когда кто-то что-то делает на нашей иконке.
hIcon - дескриптор иконки
szTip - текстовая подсказка. появляется, если задержать мышу над иконкой.
Амбуламожет, я дурак, но задача оказалось нетривиальной. заставить кэпшн пропадать с таскбара при появлении иконки и наоборот прятать иконку при выводе кэпшена - без извращений не вышло.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ShellApi, AppEvnts;
const
IconId: integer = 100;
WM_ICON = WM_APP + 100;
type
TForm1 = class(TForm)
ApplicationEvents1: TApplicationEvents;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ApplicationEvents1Minimize(Sender: TObject);
private
{ Private declarations }
protected
procedure IconMessage (var Msg: TMessage); message WM_ICON;
public
NIC: TNotifyIconData;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
NIC.cbSize := SizeOf (TNotifyIconData);
NIC.Wnd := Handle;
NIC.uID := IconId;
NIC.uFlags := NIF_ICON + NIF_MESSAGE + NIF_TIP;
NIC.hIcon := Application.Icon.Handle;
NIC.uCallbackMessage := WM_ICON;
Shell_NotifyIcon (NIM_ADD, @NIC);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Shell_NotifyIcon (NIM_DELETE, @NIC);
end;
procedure TForm1.IconMessage(var Msg: TMessage);
begin
if Msg.LParam = 514 then begin
Shell_NotifyIcon (NIM_DELETE, @NIC);
Form1.Show;
Application.Restore;
Application.BringToFront;
end;
Msg.Result := 0;
end;
procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
Shell_NotifyIcon (NIM_ADD, @NIC);
Form1.Hide;
end;
end.