一般软件运行时会在任务栏上生成一个"长方框的窗体"(真不好启齿,都不知这个得称为什么),请问要怎么办
才能够捕获用户点击了该窗体的事件?
另外请问,如果我有一个窗体的语柄,请问我得发送什么消息才能实现将这个窗体最小化或还原呢?
望请解答,万分感谢!!

解决方案 »

  1.   

    Shell_NotifyIconA
    procedure TForm1.Button3Click(Sender: TObject);
    var
        h: hwnd;
    begin
        h := FindWindow(nil,'MD5');
        if h <> 0 then
            showwindow(h,SW_MINIMIZE);
    end;
      

  2.   

    在执行程序之前,首先要改变Form1的Icon属性,给Form1装入一个图标,否则在任务栏上会出现一块空白。 
    unit Unit1;
    interface
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ShellAPI;
    const
      WM_BARICON=WM_USER+200;
      private
         procedure WMSysCommand(var
     Message: TMessage); message WM_SYSCOMMAND;
         procedure WMBarIcon(var
     Message:TMessage);message WM_BARICON;
        { Private declarations }
      public
        { Public declarations }
      end;
    var
      Form1: TForm1;
    implementation
    {$R *.DFM}
    procedure TForm1.WMSysCommand
    (var Message:TMessage);
    var
       lpData:PNotifyIconData;
    begin
      if Message.WParam = SC_ICON then
      begin
         //如果用户最小化窗口则将窗口
         隐藏并在任务栏上添加图标
         lpData := new(PNotifyIconDataA);
         lpData.cbSize := 88;
    //SizeOf(PNotifyIconDataA);
         lpData.Wnd := Form1.Handle;
         lpData.hIcon := Form1.Icon.Handle;
         lpData.uCallbackMessage := WM_BARICON;
         lpData.uID :=0;
         lpData.szTip := 'Samples';
         lpData.uFlags := NIF_ICON 
    or NIF_MESSAGE or NIF_TIP;
         Shell_NotifyIcon(NIM_ADD,lpData);
         dispose(lpData);
         Form1.Visible := False;
      end
      else
      begin
         //如果是其它的SystemCommand
         消息则调用系统缺省处理函数处理之。
         DefWindowProc(Form1.Handle,Message.
    Msg,Message.WParam,Message.LParam);
      end;
    //
    end;
    procedure TForm1.WMBarIcon(var Message:TMessage);
    var
       lpData:PNotifyIconData;
    begin
      if (Message.LParam = WM_LBUTTONDOWN) then
       begin
         //如果用户点击任务栏图标则将图标删除并回复窗口。
         lpData := new(PNotifyIconDataA);
         lpData.cbSize := 88;//SizeOf(PNotifyIconDataA);
         lpData.Wnd := Form1.Handle;
         lpData.hIcon := Form1.Icon.Handle;
         lpData.uCallbackMessage := WM_BARICON;
         lpData.uID :=0;
         lpData.szTip := 'Samples';
         lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
         Shell_NotifyIcon(NIM_DELETE,lpData);
         dispose(lpData);
         Form1.Visible := True;
       end;
    end;
    end. 
      

  3.   


    //先用image editor编辑一个图表文件加到工程中命名为trayicon
    下面程序
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,shellapi, Menus;
    const
      //定义用到的图标的ID
      TrayIconId=1;
      //定义向应用程序发送的消息类型
      CM_TRAYICON=WM_USER+1001;
    type
      TForm1 = class(TForm)
        PopupMenu1: TPopupMenu;
        test11: TMenuItem;
        test21: TMenuItem;
        test31: TMenuItem;
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        //程序图标
        AppIcon:TIcon;
        //定义一个TNotifyIconData类型的变量,通过操作它来完成程序图标的设置
        nid:TNOtifyIconData;
        //cm_tryaicon的消息处理过程
        procedure MessageHandler(var msg : TMessage); message CM_TRAYICON;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      //将trayicon调用到程序中,如果失败终止程序
      appicon:=Ticon.Create;
      appicon.Handle:=loadIcon(hinstance,'trayicon');
      if appicon.Handle=0 then
      begin
        messagebox(handle,'不能打开图标文件!','提示',mb_ok);
        application.Terminate;
        exit;
      end;
      //将nid数据结构初始化
      with nid do
      begin
        cbsize:=sizeof(tnotifyicondata);
        wnd:=handle;
        uId:=trayiconid;
        uflags:=NIF_MESSAGE OR NIF_ICON OR NIF_TIP;
        UCALLBACKMESSAGE:=0;
        hicon:=appicon.Handle;
        strpcopy(sztip,'the test app');
      end;
      //加载图标
      shell_notifyicon(NIM_ADD,@nid);
    end;
    procedure tform1.MessageHandler(var msg:tmessage);
    var
      point:TPoint;
    begin
      //判断收到消息是不是由trayicon发出如果是
      if msg.WParam=trayiconid then  //判断消息类型 做出相应处理
        case msg.LParam of
          //鼠标双击
          WM_LBUTTONDBLCLK:
            begin
              //如果显示则隐藏,如果隐藏则显示
              if visible then
                hide
              else
                show;
            end;
          //右键单击
          WM_RBUTTONUP :
            begin
              //用API函数getcursorpos将鼠标当前坐标写到定义的point结构中
              GetCursorPos(point);
              //弹出菜单
              popupmenu1.Popup(point.X,point.y);
            end;
       end;
    end;
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      //推出程序时候删除任务栏的图标
      shell_notifyicon(NIm_delete,@nid);
      appicon.Free;
    end;end.