{最简单的系统托盘组件 for D7}
{属性: }
{Visible - 是否显示托盘图标}
{方法: }
{Change - 修改托盘图标,组件使用了Application的Icon及Title,所以}
{ 当这两者之一或全部改变时,就需调用Change以更新托盘图标}
{事件: }
{OnClick - 左键点击托盘图标事件 }
{OnRightClick - 右键点击托盘图标事件}
{ }
interface
uses
Windows, Messages, Classes, ShellAPI;
type
TTrayIcon = class(TComponent)
private
FHandle: HWND;
FVisible: Boolean;
FOnClick, FOnRightClick: TNotifyEvent;
procedure SetVisible(const Value: Boolean);
procedure WndProc(var Message: TMessage);
protected
IconData: TNotifyIconData;
procedure SetTrayIcon;
procedure AddTrayIcon;
procedure DelTrayIcon;
procedure Loaded; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Change;
published
property OnClick: TNotifyEvent read FOnClick write FOnClick;
property OnRightClick: TNotifyEvent read FOnRightClick write FOnRightClick;
property Visible: Boolean read FVisible write SetVisible default True;
end;
procedure Register;
implementation
uses
SysUtils, Forms;
procedure Register;
begin
RegisterComponents(\’My Controls\’, [TTrayIcon])
end;
{ TTrayIcon }
const
WM_TRAYICONEVENT = WM_USER + 1024;
procedure TTrayIcon.AddTrayIcon;
begin
SetTrayIcon;
Shell_NotifyIcon(NIM_ADD, @IconData);
end;
procedure TTrayIcon.Change;
begin
SetTrayIcon;
if FVisible then
Shell_NotifyIcon(NIM_MODIFY, @IconData);;
end;
constructor TTrayIcon.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FHandle := Classes.AllocateHWnd(WndProc);
FillChar(IconData, SizeOf(TNotifyIconData), 0);
IconData.cbSize := SizeOf(TNotifyIconData);
IconData.Wnd := FHandle;
IconData.uId := UINT(Self);
IconData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
IconData.uCallbackMessage := WM_TRAYICONEVENT;
FVisible := True;
end;
责任编辑:小草