使用WM_SYSCOMMAND的SC_MINIMIZE和SC_RESTORE消息,
但是这个无法截获在任务栏的窗口标题点右键最小化的消息,
也无法捕获直接单击任务栏窗口标题使窗口最小化及还原的消息.
请问如何捕获这类消息.

解决方案 »

  1.   

    任务栏的窗口标题点右键最小化的消息,可以拦截到,不知你是怎么拦截的procedure MyMsg(var msg:TMessage);message WM_SYSCOMMAND;procedure TForm1.MyMsg(var msg: TMessage);
    begin
      if msg.WParam = SC_MINIMIZE then
      ShowMessage('ok');
    end;
      

  2.   

    全局钩子,另外激活窗体可能和WM_ACTIVATE有关
      

  3.   


    const
    WM_TRAYNOTIFY=WM_USER+1;//定义通知消息
    ...
    private
        { Private declarations }
        procedure SysCommand(var SysMsg: TMessage); message WM_SYSCOMMAND; //托盘
        procedure WMNID(var msg:TMessage); message WM_TRAYNOTIFY;  //托盘操作
    ...
    var
      FrmLogin: TFrmLogin;
      nd0 :NotifyIconData; //托盘
    implementation{$R *.dfm}
    procedure TFrmLogin.SysCommand(var SysMsg: TMessage);
    begin
       if (SysMsg.WParam = SC_MINIMIZE) or (SysMsg.WParam = SC_CLOSE) then // 当最小化与关闭 时
        begin
          SetWindowPos(Application.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_HIDEWINDOW);
          Hide; // 在任务栏隐藏程序
          // 在托盘区显示图标
          with nd0 do
          begin
            cbSize := SizeOf(TNotifyIconData);
            Wnd := Handle;
            uID := 0;
            uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
            uCallBackMessage := WM_TRAYNOTIFY;
            hIcon := Application.Icon.Handle;
            szTip := csMainRitle;
          end;
          Shell_NotifyIcon(NIM_ADD, @nd0); // 在托盘区显示图标
        end
       else
       inherited;
      //end;
    end;Procedure TFrmLogin.WMNID(var msg:TMessage); //托盘操作
    var
      mousepos: TPoint;
    begin
      GetCursorPos(mousepos); //获取鼠标位置
      case msg.LParam of    WM_LBUTTONUP: // 在托盘区点击左键后    begin      Self.Visible := not Self.Visible; // 显示主窗体与否      Shell_NotifyIcon(NIM_DELETE, @nd0); // 显示主窗体后删除托盘区的图标      SetWindowPos(Application.Handle, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW); // 在任务栏显示程序    end;    WM_RBUTTONUP: pm1.Popup(mousepos.X, mousepos.Y); // 弹出菜单
       end;
    end;
      

  4.   


    任务栏的窗口是Application,有区别于窗体的Form,所以,你要截获Application的消息才行,最简单的就是添加一个ApplicationEvents组件在窗体,然后处理其OnMinimize事件和OnRestore事件即可。
      

  5.   

    谢谢各位,使用了 "ccrun"的方法!
      

  6.   

    正需要 我也发现使用"ccrun"的方法比较方便简单 呵呵
    学习了