//USE API!
__________unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, ComCtrls, ShellApi, SysTray, ImgList, ExtCtrls;const
  WM_SYSTRAY = WM_USER + 1;
  IDI_TRAYICON = 0;type
  TForm1 = class(TForm)
    ImageList1: TImageList;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FWindowHandle: HWnd;
    FParentWindow: HWnd;
    FPopupMenu: TPopupMenu;
    FPopupAlign: TPopupAlignment;
    FPopupMode: TPopupMode;
    FIcon: TIcon;
    FIconData: TNotifyIconData;
    i:integer;
  public  end;var
  Form1: TForm1;implementation
{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
FPopupMode := [pmRightClick];
FPopupAlign := paRight;
FParentWindow := Handle
FWindowHandle := AllocateHWnd(WndProc);
i:=0;
FIcon := TIcon.Create;
Imagelist1.GetIcon(i,FIcon);
  With FIconData do
  begin
    uCallbackMessage:=WM_SYSTRAY;
    cbSize := SizeOf(FIconData);
    uID := IDI_TRAYICON;
    wnd := self.Handle;
    hIcon := FIcon.Handle;
    StrCopy(FIconData.szTip,'Hello');
    uFlags := NIF_ICON + NIF_TIP + NIF_MESSAGE;
  end;
  Shell_NotifyIcon(NIM_ADD, @FIconData);
end;procedure TForm1.Timer1Timer(Sender: TObject);
begin
i:=i+1;
if i=Imagelist1.Count then i:=0;
Imagelist1.GetIcon(i,FIcon);
FIconData.hIcon:=FIcon.Handle;
Shell_NotifyIcon(NIM_MODIFY, @FIconData);
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE, @FIconData);
end;procedure WndProc(var Msg: TMessage);
var
  P: TPoint;
begin
  if (Msg.WParam <> IDI_TRAYICON) then exit;
  if Assigned(FPopupMenu) then
    FPopupMenu.Alignment := FPopupAlign;  GetCursorPos(p);
  case Msg.LParam of
    WM_LBUTTONDOWN:
      begin
        if (pmLeftClick in FPopupMode) and Assigned(FPopupMenu) then
        begin
          SetForegroundWindow(FParentWindow);
          FPopupMenu.Popup(p.x,p.y);
        end;
        if Assigned(FOnIconMouseDown) then
        begin
          SetForegroundWindow(FParentWindow);
          FOnIconMouseDown(Self, mbLeft, p.x, p.y);
        end;
      end;    WM_RBUTTONDOWN:
      begin
        if (pmRightClick in FPopupMode) and Assigned(FPopupMenu) then
        begin
          SetForegroundWindow(FParentWindow);
          FPopupMenu.Popup(p.x,p.y);
        end;
        if Assigned(FOnIconMouseDown) then
        begin
          SetForegroundWindow(FParentWindow);
          FOnIconMouseDown(Self, mbRight, p.x, p.y);
        end;
      end;    WM_LBUTTONDBLCLK:
      begin
        if (pmLeftDblClick in FPopupMode) and Assigned(FPopupMenu) then
        begin
          SetForegroundWindow(FParentWindow);
          FPopupMenu.Popup(p.x,p.y);
        end;
        if Assigned(FOnIconDoubleClick) then
        begin
          SetForegroundWindow(FParentWindow);
          FOnIconDoubleClick(Self, mbLeft, p.x, p.y);
        end;
      end;    WM_RBUTTONDBLCLk:
      begin
        if (pmRightDblClick in FPopupMode) and Assigned(FPopupMenu) then
        begin
          SetForegroundWindow(FParentWindow);
          FPopupMenu.Popup(p.x,p.y);
        end;
        if Assigned(FOnIconDoubleClick) then
        begin
          SetForegroundWindow(FParentWindow);
          FOnIconDoubleClick(Self, mbRight, p.x, p.y);
        end;
      end;    else
      Msg.Result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.wParam, Msg.lParam);
  end;
end;
end.

解决方案 »

  1.   

    要是bcb就好了,一个控件 搞掂
      

  2.   

    unit Unit1;interface{ 记住在uses部分中包括 ShellAPI}usesWindows, Messages, SysUtils, Classes,Graphics, Controls, Forms, Dialogs,ShellAPI, StdCtrls;{自定义消息,当小图标捕捉到鼠标事件时Windows向回调函数发送此消息}const MY_MESSAGE = WM_USER + 100;typeTForm1 = class(TForm)procedure FormCreate(Sender: TObject);procedure FormClose(Sender: TObject; var Action: TCloseAction);procedure FormPaint(Sender: TObject);privateprocedure OnIconNotify(var Message: TMessage);message MY_MESSAGE;public{ Public declarations }end;varForm1: TForm1;implementation{$R *.DFM}{当小图标捕捉到鼠标事件时进入此过程}procedure TForm1.OnIconNotify(var Message: TMessage);constBusy: Boolean = false;beginif not Busy then beginBusy := true;if Message.LParam=WM_LBUTTONDOWN thenif Application.MessageBox('Are you sure','Exit', MB_YESNO)=IDYES then Close;Busy := false;end;end;{当主Form建立时通知Windows加入小图标}procedure TForm1.FormCreate(Sender: TObject);varnid: TNotifyIconData;beginnid.cbSize := sizeof(nid); // nid变量的字节数nid.Wnd := Handle; // 主窗口句柄nid.uID := -1; // 内部标识,可设为任意数nid.hIcon := Application.Icon.Handle; // 要加入的图标句柄,可任意指定nid.szTip := 'This is a test application'; // 提示字符串nid.uCallbackMessage := MY_MESSAGE; // 回调函数消息nid.uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE; // 指明哪些字段有效if not Shell_NotifyIcon(NIM_ADD, @nid) then beginShowMessage('Failed!');Application.Terminate;end;{将程序的窗口样式设为TOOL窗口,可避免在任务条上出现}SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);end;{程序被关闭时通知Windows去掉小图标}procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);varnid: TNotifyIconData;beginnid.cbSize := sizeof(nid); // nid变量的字节数nid.uID := -1; //内部标识,与加入小图标时的数一致nid.Wnd := Handle; //主窗口句柄Shell_NotifyIcon(NIM_DELETE, @nid); //去掉小图标end;{主窗口初始化完毕并显示时将激活Paint重画事件,此时将主窗口隐藏}procedure TForm1.FormPaint(Sender: TObject);beginHide;end;end.
      

  3.   

    想快的话下载个CoolTray控件,几秒钟搞定。
      

  4.   

    cooltray控件确实是很好用,设置几个属性即可,如果你要的我给你发一个!
      

  5.   

    Const WM_ICONCALLBACKMESSAGE=WM_USER+0;
      tind:TNotifyIconData;
        procedure  WndProc (var Message:TMessage);message WM_iconcallbackMessage;   //上面都是定义//压缩到任务栏
    tind.cbSize:=SizeOf (TNotifyIconData);
      tind.Wnd:=form1.Handle;
      tind.hIcon:=Application.Icon.Handle;
      tind.uFlags:=NIF_TIP OR NIF_ICON OR NIF_MESSAGE;
      tind.uID:=0;
      tind.szTip:='测试';
      tind.uCallBackMessage:=WM_ICONCALLBACKMESSAGE;
    shell_NotifyIcon (NIM_ADD,@tind);
    shell_NotifyIcon (NIM_delete,@tind);
    //截获点击消息的函数
     procedure  WndProc (var Message:TMessage);if msg.LParam=WM_LButtonDown then
        begin
          ShowWindow(Application.Handle,SW_Show);
          Application.Restore;
        end
      else if msg.LParam=WM_RButtonDown then
        begin
          GetCursorPos(p);
          PopupMenu1.Popup(p.x,p.y);
        end;
      

  6.   

    TO: lydwei() 
         MY E-mail: [email protected]
           Thank you!!!
      

  7.   

    就是托盘吗
    这个问题好解决
    就象zsy_good(如果你想说你爱我,那么请你不要插
    所例的