托盘程序,想做成这样:
在主画面状态下,点任务栏,就收回到系统托盘。(就像flashgetg那样子)
要怎么做呢?(主要是怎么获取用户点击了该程序的任务栏这个消息)还有一个问题,怎么执行windows的刷新动作,调用哪个api函数?

解决方案 »

  1.   

    抄来的,你看看行不?呵呵WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
        DWORD dwMessage, // message identifier
        PNOTIFYICONDATA pnid // pointer to structure
       ); 参数说明:
     dwMessage
      向系统发出的对任务条状态区图标的控制消息,可以为以下三个值:  NIM_ADD  向任务条状态区添加图标.
      NIM_DELETE 删除任务条状态区的图标.
      NIM_MODIFY 更换任务条状态区的图标. 
     pnid  指向记录型数据NOTIFYICONDATA的指针.返回值:成功则返回非零值,失败则返回零值。typedef struct _NOTIFYICONDATA { 
        DWORD cbSize; 
        HWND hWnd; 
        UINT uID; 
        UINT uFlags; 
        UINT uCallbackMessage; 
        HICON hIcon; 
        char szTip[64]; 
    } NOTIFYICONDATA, *PNOTIFYICONDATA; 记录成员:cbSize记录型数据NOTIFYICONDATA的大小 .hWnd需要在任务条状态区生成图标的应用程序窗口的句柄。uID应用程序定义的任务条图标的标识.uFlags显示其他成员是否有确定的数据标志性数组,其他成员有:NIF_ICON       确认hIcon成员. 
    NIF_MESSAGE    确认uCallbackMessage成员.
    NIF_TIP       确认szTip成员.
     
    uCallbackMessage当鼠标事件发生在任务条图标区域时所发出的应用程序自定义的消息。hIcon要操作的图标的句柄。szTip图标所显示的hint文字.
      

  2.   

    我看书上的程序自己做的,应该可以满足你要求了。unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ShellAPI, StdCtrls, Menus, AppEvnts;const
        WM_TrayMessage=WM_User+500;
    type
      TForm1 = class(TForm)
        CheckBox1: TCheckBox;
        PopupMenu1: TPopupMenu;
        Hello1: TMenuItem;
        World1: TMenuItem;
        procedure CheckBox1Click(Sender: TObject);
        procedure Hello1Click(Sender: TObject);
        procedure World1Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
          NID: TNotifyIconData;
        { Private declarations }
      public
          procedure WMTrayMessage(var msg:TMessage);message WM_TrayMessage;
          //建立wm_traymessage的映射。
          //声明是traymessage,只要tray有message,那么就会执行wmtraymessage
          procedure wmsyscommand(var Msg:TWMSysCommand); message WM_SYSCOMMAND;
          //托盘图标的返回消息  end;var
      Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.WMTrayMessage(var msg: TMessage);
    var
        p:TPoint;
    begin
        if (Msg.LParam=WM_LBUTTONDBLCLK) then
        begin
            MessageDlg('您在任务栏图标上按双击左键', mtInformation, [mbOK], 0);
        end;
        if msg.LParam=WM_RButtonDown then
        begin
            GetCursorPos(p); //取光标位置
            PopupMenu1.Popup(p.x,p.y);  //弹出菜单
        end;
      if (msg.LParam=WM_LButtonDown) and Form1.Enabled then
        begin
          Form1.Visible:=not Form1.Visible;
    //      Shell_NotifyIcon(NIM_DELETE,@NID);
        end;
    end;procedure TForm1.CheckBox1Click(Sender: TObject);
    begin
      if CheckBox1.Checked then Shell_NotifyIcon(NIM_ADD,@NID) else Shell_NotifyIcon(NIM_DELETE,@NID);
        {Shell_NotifyIcon是tray区编程函数,它只有两个参数
         第一个参数可为:nim_add :向tray区增加一个图标
                         nim_delete:删除tray区一个图标
                         nim_modify:修改tray区一个图标
         第二个参数包含的信息可以用于系统对任务tray区的处理
         }
    end;procedure TForm1.Hello1Click(Sender: TObject);
    begin
        MessageDlg('Hello!', mtInformation, [mbOK], 0);
    end;procedure TForm1.World1Click(Sender: TObject);
    begin
        MessageDlg('World!', mtInformation, [mbOK], 0);
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      CheckBox1.Checked := False;
    end;procedure TForm1.wmsyscommand(var Msg: TWMSysCommand);
    begin
      if (Msg.CmdType=SC_MINIMIZE) or (Form1.Enabled=false) THEN
        begin
          Shell_NotifyIcon(NIM_ADD,@NID);
          Form1.Hide;
        end
      else
        INHERITED;
        //如果消息是mimimize,就处理消息,否则,让它继续传下去。
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
        NID.cbSize:=SizeOf(TNotifyIconData);
        NID.hIcon:=Application.Icon.Handle;
        NID.szTip:='欢迎使用任务栏图标';
        NID.uCallbackMessage:=WM_TrayMessage;
        NID.uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
        {uflags描述那些项有效
        nif_icon:hicon有效
        nif_message:ucallbackmessage有效
        nif_tip:tip有效}
        NID.uID:=0;
    //uID域是程序员定义的一个唯一标识符。如果一个应用程序有多个托盘图标,则每个图标需要有唯一的I D
        NID.Wnd:=Handle;{tray区返回消息的对象,这些消息将用户对tray区图标的操作通知给程序}
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      Shell_NotifyIcon(NIM_DELETE,@NID);
    end;end.
      

  3.   

    搞那么麻烦干什么,网上有现成的控件叫trayicon,Down一个下来,想学的的话,研究研究源码
    这个控件有多种效果