我参照一些文章自己做了个系统托盘的程序,但是有几个小问题想请教一下各位高手
1.程序结束后也释放了图标,但图标不会自动从任务栏上消失,非要鼠标移动到那里一下。
2.我的程序在处理数据,点右键,菜单很久才会出来,而且又要很久才能选择,怎样解决?
3.点右键弹出菜单后若不进行选择,那么点菜单以外的任何地方,菜单不会自动消失,真是困惑。
高手指点一下,先谢过了。

解决方案 »

  1.   

    第一项属于Windows自身任务栏刷新问题,好像可以通过重载函数解决。
    第二项不清楚。
    第三项是应该属于热点更替的问题吧。本人水平有限,请更多高手指点指点。
      

  2.   

    http://community.csdn.net/Expert/topic/3566/3566802.xml?temp=.6300318
    http://community.csdn.net/Expert/topic/3436/3436573.xml?http://community.csdn.net/Expert/topic/3205/3205536.xml?temp=.5616114
      

  3.   

    你的托盘是用什么做的?现在有很多VCL直接带有托盘功能,装一个就可以了
      

  4.   

    1.程序结束后也释放了图标,但图标不会自动从任务栏上消失,非要鼠标移动到那里一下。
    请确认你释放了,检查API的返回值,有可能参数不对没正确释放.2.我的程序在处理数据,点右键,菜单很久才会出来,而且又要很久才能选择,怎样解决?
    换一台快点的机器.或把你处理数据的部分写到另外一个线程,把该线程的优先度调低.3.点右键弹出菜单后若不进行选择,那么点菜单以外的任何地方,菜单不会自动消失,真是困惑。
    弹出菜单之前,把该菜单的Form置为前端窗口,这个问题问烂了,一搜一大堆.
      

  5.   

    那是没有释放掉里面的东西,你试试这个?
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,shellapi, Menus;
    const  
           WM_TrayMessage=WM_User+100;
    type
      TForm1 = class(TForm)
        PopupMenu1: TPopupMenu;
        N11: TMenuItem;
        N21: TMenuItem;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
           protected  
               procedure  AppMinimized(Sender:  TObject);  
               procedure  WMTrayMessage(var  msg:TMessage);message  WM_TrayMessage;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
       NID:TNotifyIconData;
    implementation{$R *.dfm}
     procedure  TForm1.AppMinimized(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;  
       NID.uID:=0;  
       NID.Wnd:=Handle;  
       Shell_NotifyIcon(NIM_ADD,@NID);  
       ShowWindow(Application.Handle,SW_Hide);  
     
    end;
    procedure  TForm1.WMTrayMessage(var  msg:  TMessage);  
     var  
       p:TPoint;  
    begin  
       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;  
    end;  
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    Application.OnMinimize:=AppMinimized;  
       AppMinimized(nil);
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
    Shell_NotifyIcon(NIM_DELETE,@NID);
    end;end.
      

  6.   

    创建的时候是不是有内存溢出。?查一下那一块的代码吧。
    单独创建一个托盘程序看看有没有错,如果没有的话,下一步,看看是哪错了。真正的错误 ,如果是托盘的问题,说明是这段代码了,网上有很多托盘例子都不错。排除一下吧!OK!看一下这个原来的问题:
    程序退出后在任务栏中留下一个空格,点一下才消失 :
    要解决这个问题,首先得找原因,造成这个问题,是因为Form的 WindowState= wsMaximized,而且 Form的BorderIcons 中没有 biMaximize 属性。如果From的BorderStyle的属性是bsNone,只在BorderIcons中添加biMaximize还不能解决问题,必须得设置From的BorderStyle的属性不为bsNone,比如说,是bsSingel等,为此可以有以下解决办法: procedure TForm1.FormCloseQuery(Sender: TObject;var CanClose: Boolean); 
    begin 
        Form1.BorderIcons :=Form1.BorderIcons + [biMaximize]; 
        Form1.BorderStyle := bsSingle ;
    end;是不是有此类的原因呢?窗体设计的有没有问题,祝你成功了
      

  7.   

    托盘,我一直用TrayIcon,效果真的不错!