This is a sample 
为了更有效地利用显示器的空间,多数程序员都有过这样的经验,即通过Windows任务栏属性对话框,在“任务栏选项”页中将任务栏设置为“自动隐藏”,并且为了在需要任务栏时操作方便,选择任务栏“总在最前”。完成上述设置后,当程序员编辑文档或编写代码时,任务栏会自动隐藏,增加了显示器的可利用空间;而当程序员需要操作任务栏时,只需将鼠标移动到任务栏所在位置的显示器边缘上,这时任务栏就会自动出现。但如果任务栏没有设置成“总在最前”,此时任务栏就不会自动弹出。 
要控制Windows任务栏的隐藏和显示,可以通过调用一组API函数来实现。这组API函数分别是: 
(1) FindWindow函数 
该函数通过指定的类名和窗口名来检索指定的高层窗口句柄,如果检索成功,则返回窗口句柄,否则返回空;另外,需注意改函数不能用于查找子窗口。函数如下: 
HWND FindWindow(LPCTSTR lpClassName, //类名指针 
LPCTSTR lpWindowName //窗口名指针 
); 
(2) ShowWindow函数 
该函数用于设置指定窗口的显示状态。函数如下: 
BOOL ShowWindow(HWND hWnd, //指定窗口的句柄 
Int nCmdShow //指定窗口的显示状态,可以设置为SW_HIDE,SW_SHOW等 
); 
(3) SetWindowPos函数 
该函数用于设置指定窗口的大小、显示位置和显示顺序等信息。函数如下: 
BOOL SetWindowPos( 
HWND hWnd, // 指定窗口的句柄 
HWND hWndInsertAfter, // 指定窗口的显示顺序,可以设为如下一组值:HWND_BOTTOM、HWND_NOTOPMOST、HWND_TOP、HWND_TOPMOST  
int X, // 指定窗口的横坐标位置 
int Y, // 指定窗口的纵坐标位置 
int cx, // 指定窗口的宽度 
int cy, // 指定窗口的长度 
UINT uFlags // 指定窗口的尺寸和位置标记,可以取一组值或这些值的组合 
); 
下面本文以一个具体的例子,详细介绍一下在Delphi 5.0中实现Windows任务栏显示和隐藏的步骤。 
1. 创建一个应用程序,在主窗体上增加二个TButton组件和一个TcheckBox组件。设置其中一个TButton组件的Caption属性为“隐藏Windows的任务栏”,设置另一个TButton组件的Caption属性为“显示Windows的任务栏”,设置TcheckBox组件的Caption属性为“总在最前”。 
2. 编辑TForm1.Button1Click(Sender: TObject) 
隐藏Windows的任务栏,代码如下: 
procedure TForm1.Button1Click(Sender: TObject); 
var 
wndHandle: THandle; //用于存储指定窗口的句柄 
wndClass: array[0..50] of Char; //用于存储类名 
begin 
strPCopy(@wndClass[0], 'Shell_TrayWnd'); //获取任务栏类名 
wndHandle := FindWindow(@wndClass[0],nil); //获取任务栏窗口的句柄 
ShowWindow(wndHandle, SW_Hide); //隐藏Windows任务栏 
button2.Enabled := True; //设置“显示Windows任务栏”按钮变为可操作状态 
button1.Enabled := False; //设置“隐藏Windows任务栏”按钮变为不可操作状态 
end; 
3. 编辑TForm1.Button2Click(Sender: TObject) 
显示Windows的任务栏,并判断“总在最前”TcheckBox组件是否选中,如果选中,则任务栏总是显示在最前方,否则任务栏显示在最底层。代码如下: 
procedure TForm1.Button2Click(Sender: TObject); 
var 
wndHandle: THandle; 
wndClass: array[0..50] of Char; 
begin 
strPCopy(@wndClass[0], 'Shell_TrayWnd'); 
wndHandle := FindWindow(@wndClass[0],nil); 
ShowWindow(wndHandle, SW_SHOW); //显示Windows的任务栏 
//判断“总在最前”复选框是否选中 
if CheckBox1.checked then //如果选中,则设置任务栏为最顶层窗口 
SetWindowPos(wndHandle, HWND_TOPMOST, r.top, r.left, r.bottom, r.right, SWP_NOMOVE) 
Else //否则,设置任务栏为最底层窗口 
SetWindowPos(wndHandle, HWND_BOTTOM, r.top, r.left, r.bottom, r.right, SWP_NOMOVE); 
//设置按钮的操作状态 
button2.Enabled := False; 
button1.Enabled := True; 
end; 
4. 打开Windows任务栏属性对话框,不选中“自动隐藏”和“总在最前”两个复选框,并确定后关闭该对话框。运行上述创建的应用程序,即可控制Windows任务栏的显示和隐藏。 

解决方案 »

  1.   

    不好意思,贴错了,下面是这个例子!
    系统状态栏图标是指在Windows桌面系统下边的任务栏右边区域内显示的小图标,通常包括时间和输入法,另外,还会包括一些应用程序,如金山词霸或其它一些杀毒软件等的小图标。通常用鼠标右键点击这些小图标时会弹出菜单,通过选择这些菜单可以灵活地实现程序的各项功能。 
    下面本文以一个具体的例子,详细介绍一下利用Delphi实现系统状态栏图标的步骤和方法。 
    首先,介绍一下本实例要实现的功能:程序开始运行时会在系统状态栏生成一个小图标,同时会打开应用程序窗口,并在任务栏上显示相应的程序窗口;当用户关闭应用程序窗口时,该窗口和任务栏上相应的应用程序窗口都会消失,但应用程序并没有退出;当用户用鼠标左健单击该图标时,会再次打开应用程序窗口,同时在任务栏上显示应用程序窗口;当用户用鼠标右键单击系统状态栏中应用程序的小图标时,会弹出菜单,选择菜单项“退出”可以完全退出应用程序。 
    一、 实现步骤 
    1. 创建一个应用程序,在主窗体上增加一个TpopupMenu组件。并为该弹出菜单组件增加菜单项Exit,标题为“退出”。 
    2. 在Uses中添加ShellAPI,因为在系统状态栏中增加图标时需调用ShellAPI函数Shell_NotifyIconA。该函数需要2个参数,其中一个是TnotifyIconDataA结构,需在主窗体中增加TnotifyIconDataA类型全局变量ntida。 
    3. 定义消息mousemsg,并编写主窗体的mousemessage消息处理函数,此函数说明在图标上用鼠标左键单击时,会打开应用程序窗口;用鼠标右键单击时,会弹出一个菜单。 
    下面给出步骤2和3的实现代码: 
    unit Unit1; 
    interface 
    uses 
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
    StdCtrls, ExtCtrls, Menus, shellapi; 
     
    const 
    mousemsg = wm_user + 1; //自定义消息,用于处理用户在图标上点击鼠标的事件 
    iid = 100; //用户自定义数值,在TnotifyIconDataA类型全局变量ntida中使用。 
     
    type 
    TForm1 = class(TForm) 
    ...... 
    private 
    //自定义消息处理函数,处理鼠标点击图标事件 
    procedure mousemessage(var message: tmessage); message mousemsg;  
    public 
    { Public declarations } 
    end; 
     
    var 
    Form1: TForm1; 
    ntida: TNotifyIcondataA; //用于增加和删除系统状态图标 
    implementation 
     
    {$R *.DFM} 
     
    procedure TForm1.mousemessage(var message: tmessage); 
    var 
    mousept: TPoint; //鼠标点击位置 
    begin 
    inherited; 
    if message.LParam = wm_rbuttonup then begin //用鼠标右键点击图标 
    getcursorpos(mousept); //获取光标位置 
    popupmenu1.popup(mousept.x, mousept.y); //在光标位置弹出菜单 
    end; 
    if message.LParam = wm_lbuttonup then begin //用鼠标左键点击图标 
    //显示应用程序窗口 
    ShowWindow(Handle, SW_SHOW); 
    //在任务栏上显示应用程序窗口 
    ShowWindow(Application.handle, SW_SHOW); 
    SetWindowLong(Application.Handle, GWL_EXSTYLE, 
    not (GetWindowLong(Application.handle, GWL_EXSTYLE) 
    or WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW)); 
    end; 
    message.Result := 0; 
    end 
    4. 编辑TForm1.FormCreate(Sender: TObject) 
    应用程序开始运行时,在系统状态栏上生成图标显示,代码如下: 
    procedure TForm1.FormCreate(Sender: TObject); 
    begin 
    ntida.cbSize := sizeof(tnotifyicondataa); //指定ntida的长度 
    ntida.Wnd := handle; //取应用程序主窗体的句柄 
    ntida.uID := iid; //用户自定义的一个数值,在uCallbackMessage参数指定的消息中使用 
    ntida.uFlags := nif_icon + nif_tip + nif_message;//指定在该结构中uCallbackMessage、hIcon、szTip参数都有效 
    ntida.uCallbackMessage := mousemsg;//指定的窗口消息 
    ntida.hIcon := Application.Icon.handle;//指定系统状态栏显示应用程序的图标句柄 
    ntida.szTip := 'Icon'; //当鼠标停留在系统状态栏该图标上时,出现该提示信息 
    shell_notifyicona(NIM_ADD, @ntida); //在系统状态栏增加一个新图标 
    end; 
    5. 编辑Tform1.OnClose 
    当用户关闭应用程序窗口时,该窗口和任务栏上相应的应用程序窗口都消失,但程序并没有退出。代码如下: 
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); 
    begin 
    Action := caNone; //不对窗体进行任何操作 
    ShowWindow(Handle, SW_HIDE); //隐藏主窗体 
    //隐藏应用程序窗口在任务栏上的显示 
    ShowWindow(Application.Handle, SW_HIDE); 
    SetWindowLong(Application.Handle, GWL_EXSTYLE, 
    GetWindowLong(Application.handle, GWL_EXSTYLE) 
    or WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW); 
    end; 
    6. 编辑弹出菜单Exit 
    当用户点击该菜单时完全退出应用程序。代码如下: 
    procedure TForm1.ExitClick(Sender: TObject); 
    begin 
    //为ntida赋值,指定各项参数 
    ntida.cbSize := sizeof(tnotifyicondataa); 
    ntida.wnd := handle; 
    ntida.uID := iid; 
    ntida.uFlags := nif_icon + nif_tip + nif_message; 
    ntida.uCallbackMessage := mousemsg; 
    ntida.hIcon := Application.Icon.handle; 
    ntida.szTip := 'Icon'; 
    shell_notifyicona(NIM_DELETE, @ntida); //删除已有的应用程序图标 
    Application.Terminate; //中断应用程序运行,退出应用程序 
    end; 
    二、 技术要点 
    1.程序中在增加或删除系统状态栏图标时,需调用ShellAPI函数Shell_NotifyIconA,该函数有两个参数,其中一个是TnotifyIconDataA结构,在前面的程序注释中已经对其进行了介绍;另一个参数是dwMessage,通过不同的取值表示是增加图标、修改图标或删除图标。 
    2.通过调用一组API函数,实现在任务栏上显示或隐藏应用程序窗口。这些函数分别为ShowWindow、SetWindowLong和GetWindowLong。其中,ShowWindow用于设置指定窗口的显示状态;SetWindowLong和GetWindowLong分别用于改变和检索指定窗体的一个属性。 
      

  2.   

    unit TestForm; 
      
      interface 
      
      uses 
        Windows, Classes, Forms, Controls, StdCtrls, ExtCtrls; 
      
      type 
      
        TZoomAction = (zaMinimize, zaMaximize); 
      
        TfrmTest = class(TForm) 
          procedure FormClose(Sender: TObject; var Action: TCloseAction); 
          procedure FormShow(Sender: TObject); 
        private 
          { Private declarations } 
        public 
          { Public declarations } 
        end; 
      
      var 
        frmTest: TfrmTest; 
      
      implementation 
      
      {$R *.DFM} 
      
      procedure ZoomEffect(theForm: TForm; theOperation: TZoomAction); 
      var 
         rcStart: TRect; 
         rcEnd: TRect; 
         rcTray: TRect; 
         hwndTray : hWnd; 
         hwndChild: hWnd; 
      begin 
           { 获取系统的Tray区域的边界矩形 } 
           hwndTray := FindWindow('Shell_TrayWnd', nil); 
           hwndChild := FindWindowEx(hwndTray, 0, 'TrayNotifyWnd', nil); 
           GetWindowRect(hwndChild, rcTray); 
      
           { 检查最大化/最小化状态以交换开始/结束矩形 } 
           if theOperation = zaMinimize then 
              begin 
                   rcStart := theForm.BoundsRect; 
                   rcEnd := rcTray; 
              end 
           else 
              begin 
                   rcEnd := theForm.BoundsRect; 
                   rcStart := rcTray; 
              end; 
      
           { 这里会发生一些奇妙的事... } 
           DrawAnimatedRects(theForm.Handle, IDANI_CAPTION, rcStart, rcEnd) 
      end; 
      
      procedure TfrmTest.FormClose(Sender: TObject; var Action: TCloseAction); 
      begin 
           ZoomEffect(Self, zaMinimize); 
      end; 
      
      procedure TfrmTest.FormShow(Sender: TObject); 
      begin 
           ZoomEffect(Self, zaMaximize); 
      end; 
      
      end. 
      

  3.   

    Rx控件包有个RxTrayIcon控件,把它放在form上就可以实现要求了
    可以自己定义事件,用起来简便。
      

  4.   

    taidy() 兄,例子不错!
    改天试试!
      

  5.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ShellAPI,StdCtrls;
    const MY_MESSAGE = WM_USER + 100;
    type
      TForm1 = class(TForm)
        procedure FormPaint(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        procedure OnIconNotify(var Message: TMessage);
        message MY_MESSAGE;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: 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;procedure TForm1.FormPaint(Sender: TObject);
    begin
    hide;
    end;procedure TForm1.FormCreate(Sender: TObject);
    varnid: TNotifyIconData;beginnid.cbSize := sizeof(nid); // nid±äÁ¿µÄ×Ö½ÚÊýnid.Wnd := Handle; // Ö÷´°¿Ú¾ä±únid.uID := 0;// ÄÚ²¿±êʶ£¬¿ÉÉèΪÈÎÒâÊýnid.hIcon := Application.Icon.Handle; // Òª¼ÓÈëµÄͼ±ê¾ä±ú£¬¿ÉÈÎÒâÖ¸?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;
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);varnid: TNotifyIconData;beginnid.cbSize := sizeof(nid); // nid±äÁ¿µÄ×Ö½ÚÊýnid.cbSize := sizeof(nid); // nid±äÁ¿µÄ×Ö½ÚÊýnid.uID := 0; //ÄÚ²¿±êʶ£¬Óë¼ÓÈëСͼ±êʱµÄÊýÒ»ÖÂnid.Wnd := Handle; //Ö÷´°¿Ú¾ä±úShell_NotifyIcon(NIM_DELETE,@nid); //È¥µôСͼ±êShell_NotifyIcon(NIM_DELETE,@nid); //È¥µôСͼ±êend;end.