我用了Raize中的Rztrayicon控件制作托盘。我希望在程序运行时候就最小化在右下角显示。所以我在Form.create里面加了Application.ShowMainForm := False。
程序果然启动后就在右下角显示。但是问题出现了,我定义的左键双击显示窗口,可是窗口弹出来了,可是看不到,就在任务栏看到。这应该怎么办?我写了Application.ShowMainForm := True,还是不行,请高手帮忙,另外我想在双击左键后希望先显示个对话框,要求输入密码,密码验证正确了才能显示主窗口,这应该怎么实现?请高手帮忙

解决方案 »

  1.   

    BOOL WINAPI Shell_NotifyIcon(    DWORD dwMessage, // message identifier
        PNOTIFYICONDATA pnid // pointer to structure
       );333333333333332
    private
          { Private declarations }
        Tray:NOTIFYICONDATA;
        procedure ShowInTray();{窗体最小化后,显示在托盘中}
    procedure tform1.ShowInTray;
    Begin
    Tray.cbSize:=sizeof(Tray);
    Tray.Wnd:=Self.Handle;
    Tray.uFlags:=NIF_ICON+NIF_MESSAGE+NIF_TIP;
    Tray.uCallbackMessage:=WM_USER;
    Tray.hIcon:=application.Icon.Handle ;
    Tray.szTip:='hello';
    Shell_NotifyIcon(NIM_ADD,@Tray);
    End;{右键单击托盘中的图标,显示快捷菜单}
    procedure Tform1.TrayMenu(var Msg:TMessage);
    var
    X,Y:Tpoint;
    J,K:Integer;
    Begin
    GetCursorPos(X);
    GetCursorPos(Y);
    J:=X.X;
    K:=Y.Y;
    if Msg.LParam=WM_RBUTTONDOWN then PopupMenu1.Popup(J,K);
    End;缩小到托盘
          ShowWindow(Application.Handle,sw_minimize);
          ShowWindow(Application.Handle,sw_hide);
          ShowInTray;
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      {删除托盘中的图标}
      Shell_NotifyIcon(NIM_DELETE,@Tray);
    end;///////////////3
    private
        nid:TNotifyIconData;
        procedure OnMinimize(Sender: TObject);
        procedure IconTray(var Msg:TMessage); Message WM_command;   //先声明procedure TForm1.OnMinimize(Sender: TObject);
    begin
      if IsWindowEnabled(Handle) then
      begin
        Hide;
      end;
    end;
    procedure TForm1.IconTray(var Msg:Tmessage);
    var
      pt:TPoint;
    begin
      if Msg.LParam=WM_RBUTTONUP then  //鼠标右键
      begin
        GetCursorPos(pt);
        SetForeGroundWindow(Handle);
        PopupMenu1.Popup(pt.x,pt.y);
      end;
      if Msg.LParam=WM_LBUTTONDBLCLK then  //鼠标双击
      begin
        setforegroundwindow(Handle);
        show;
      end;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      nid.uFlags:=0;
      Shell_NotifyIcon(NIM_DELETE,@nid);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      Application.ShowMainForm:=False;
      Application.OnMinimize:=OnMinimize;    nid.cbSize:=sizeof(nid);
        nid.Wnd:=Handle;
        nid.uID:=1;
        nid.uCallbackMessage:=wm_command;
        nid.hIcon:=Application.Icon.Handle;
        nid.szTip:='应用程序服务器测试程序';
        nid.uFlags:=nif_message or nif_Icon or nif_Tip;
        Shell_NotifyIcon(NIM_Add,@nid);
    end;
      

  2.   

    Delphi托盘编程实战演练 --------------------------------------------------------------------------------
     
        很多人认为Delphi是一个RAD工具,包括我本人在上学的时候对Delphi也有偏见,现在走出了“象牙塔”,涉及的面广了,遇到的问题多了,慢慢地也有了自己的一点心得体会。其实,Delphi是基于Object Pascal 语言的开发工具,也就是说Delphi本质上是一种语言工具,并且是真正的面向对象的。下面我举的例子就是用Delphi实现的一个托盘小程序。程序短小精悍,脉络分明,我将对关键部分进行详细讲解。就象候俊杰先生把MFC一层一层地剥开一样,今天我也来一次“庖丁解牛”。   在Delphi中涉及到系统编程的方面毫无例外都要调用API函数,在ShellAPI.pas单元中有要用到的API函数的原型。实战演练:一.新建一个应用程序:File->New Applicaton 在Interface部分定义一个消息常量:const WM_NID=WM_USER+1000; 系统规定从WM_USER开始为用户自定义消息。二.定义一个全局变量: NotifyIcon:TNotifyIconData,NotifyIcon是非常重要的一个变量,整个程序基本上是围着这个变量在转。TNotifyIconData是一个记录类型,按住Ctrl键,在TNotifyIconData 双击即进入ShellAPI.pas单元。(注:在Delphi中,这是一个非常好的对源代码进行分析的方法,源代码说明一切,你要想知道程序背后的内幕,最好的方法就是分析源代码!)此时出现了以下赋值语句:TNotifyIconData = TNotifyIconDataA,这个意思很明显,就是说TNotifyIconData和TNotifyIconDataA是同种数据类型,接着往下看有:TNotifyIconDataA = _NOTIFYICONDATAA,意思与刚才的一样,再往下看:  type_NOTIFYICONDATAA = record       cbSize: DWORD;       Wnd: HWND;       uID: UINT;       uFlags: UINT;       uCallbackMessage: UINT;       hIcon: HICON;szTip: array [0..63] of AnsiChar;end;这可真是“千呼万唤始出来,犹抱琵琶半遮面”。现在大家很清楚了,我们刚才定义的全局变量NotifyIcon其实是一个包含有7个成分的记录类型变量,就相当于C/C++中的结构体变量(C/C++的程序员应该是再熟悉不过了)。下面我们逐个来解释记录类型中的7个部分各有什么功能。1>        cbSize就是你定义的NotifyIcon变量的大小,用SizeOf(TNotifyIconData)可以取得,如果你是一个熟练的C/C++程序员,你应该不会陌生。在C/C++中,每当要为一个结构体变量分配内存的时候都要:通过 SizeOf(Struct type) 来获知存放一个这样的结构体变量要多少内存。2>        Wnd是一个句柄,你希望托盘程序产生的消息有哪个窗体来处理就让Wnd指向那个窗体。例如:你准备在任务栏的托盘小图标上单击时窗体是窗体在“显示”和“隐藏”之间切换,则把Wnd指向主窗体。3>  uID:如果你要创建多个托盘小程序,那么怎么区分它们呢?就是靠这个ID号来区分。3>        uFlags是一个标志位,它表示当前所创建的托盘程序具有哪些性质:NIF_ICON          表示当前所设置的图标(即hIcon的值)是有效的 NIF_MESSAGE  表示当前所设置的系统消息(即uCallBackMessage的值)是有效的NIF_TIP          表示当前所设置的提示条(即szTip的值)是有效的。4>        uCallBackMessage这是7个部分里面最重要的一个。这里指定一个回调消息,也就是说这里定义一个消息名,当你单击或者右击托盘图标的时候就会向你在Wnd所指向的窗体发送一个在uCallBackMessage中定义的消息名,然后你在程序中定义一个消息出来函数来处理这个消息。这样就把Windows关于消息的整套流程都处理好了。 6>   hIcon为托盘图标的句柄,根据这个句柄你就可以增加、修改、删除图标。7>       szTip就是当你的鼠标放到任务栏托盘的小图标上的时候弹出来的提示信息。在这里我花了大量的笔墨介绍TNotifyIconData的内幕,把这部分搞清楚了,后面的东西就顺理成章了。三. 双击主窗体,进入FormCreate的代码区域:TForm1.FormCreate(Sender:TObject);    Begin        //NotifyIcon为全局变量,在程序的开头已经定义了        with NotifyIcon do        begin  cbSize:=SizeOf(TNotifyIconData);  Wnd:=Handle;   //指向当前窗体Form1的句柄uID:=1;  uFlags:=NIM_ICON or NIM_MESSAGE or NIM_TIP;  uCallBackMessage:=WM_NID;  hIcon:=Application.Icon.Handle;  szTip:=”张家恶少”;end;.//把设置好的变量NotifyIcon加入到系统中以便处理Shell_NotifyIcon(NIM_ADD,@NotifyIcon);   End;四.接下来就是定义一个消息处理函数:系统给窗体发来了一个消息,就由下面这个函数来处理。每个消息处理函数都是处理某一类消息的,大家仔细地看看下面函数体的定义和一般的函数定义有什么不一样:消息处理函数要在后面加上消息的名称,这样当系统发来WM_NID消息时,就是自动触发WMNID消息处理函数。procedure WMNID(var msg:TMessage);message WM_NID;       begin        case msg.LParam of          WM_LBUTTONUp; Form1.Visible:=not Form1.Visible;           WM_RBUTTONUP: ShowMessage(‘您点击的是右键’);        End;End;好了,一个最简单的程序诞生了,大家自己设置好自己喜欢的图标.Project->Options,选中Application页面,在Icon项中加载自己喜欢的图标,这样程序运行时,在任务栏里显示的就是你喜欢的图标了。当你单击图标时,窗体Form1会在可见与不可见之间切换,也就是说单击一下显示,再单击一下又隐藏。当你右击图标的时候会弹出一条消息:“你点击的是右键”。五.最后要记住在关闭应用程序的时候要释放掉建立的托盘程序,否则会占用系统资源。TForm1.FormDestroy(Sender:TObject);Begin  Shell_NotifyIcon(NIM_DELETE,@NotifyIcon);End; 
    from  网上
      

  3.   

    >>但是问题出现了,我定义的左键双击显示窗口,可是窗口弹出来了,可是看不到,就在任务栏看到。你的代碼有問題,
    除了你說的, 還要設置 
    Application.MainForm.Visible := true;
      Application.Restore;
      Application.BringToFront;之類
      

  4.   

    >>.另外我想在双击左键后希望先显示个对话框,
    先顯示你的 对话框 窗體, 判斷後再處理
      

  5.   

    var
      Spassword:String;
    begin
      Spassword := '';
      if InputQuery('请输入密码:', Emptystr,SPassword) then
      begin
        if Spassword = yourpassword then 恢复
        else 密码错误;
      end
    end;