把Application.OnMinimize := FormHide;写到FORMACTIVE里面试试……

解决方案 »

  1.   

    我是這樣的:
    procedure wmmytrayiconcallback(var Msg : TMessage); //处理点击托盘图标的事件
      message WM_MYTRAYICONCALLBACK;
    procedure FormHide(Sender : TObject);//当用户单击最小化按钮的处理过程......
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Application.OnMinimize := FormHide;
    end;procedure TForm1.wmmytrayiconcallback(var Msg: TMessage);
    //处理点击托盘图标的事件,根据 WM_MOUSEMOVE 消息的不同情况产生不同的回应
    var
      CursorPos : TPoint;
    begin
      Form1.WindowState :=wsNormal;
      PopupMenu1.AutoPopup:=False;
      case Msg.lParam of
        //左键双击
        WM_LBUTTONDBLCLK : begin
                            Application.ShowMainForm := True;
                            SetForegroundWindow(Application.Handle);
                          end;
        //右键按下
        WM_RBUTTONDOWN :  begin
                            GetCursorPos(CursorPos);
                            PopupMenu1.Popup(CursorPos.x,CursorPos.y);
                          end;
      end//case
    end;procedure TForm1.FormHide(Sender: TObject);
    begin
        把它隱;
    end;
      

  2.   

    我是這樣的:
    procedure wmmytrayiconcallback(var Msg : TMessage); //处理点击托盘图标的事件
      message WM_MYTRAYICONCALLBACK;
    procedure FormHide(Sender : TObject);//当用户单击最小化按钮的处理过程......
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Application.OnMinimize := FormHide;
    end;procedure TForm1.wmmytrayiconcallback(var Msg: TMessage);
    //处理点击托盘图标的事件,根据 WM_MOUSEMOVE 消息的不同情况产生不同的回应
    var
      CursorPos : TPoint;
    begin
      Form1.WindowState :=wsNormal;
      PopupMenu1.AutoPopup:=False;
      case Msg.lParam of
        //左键双击
        WM_LBUTTONDBLCLK : begin
                            Application.ShowMainForm := True;
                            SetForegroundWindow(Application.Handle);
                          end;
        //右键按下
        WM_RBUTTONDOWN :  begin
                            GetCursorPos(CursorPos);
                            PopupMenu1.Popup(CursorPos.x,CursorPos.y);
                          end;
      end//case
    end;procedure TForm1.FormHide(Sender: TObject);
    begin
        把它隱藏;
    end;
      

  3.   

    procedure TForm1.FormHide(Sender: TObject);
    begin
      Form1.Visible :=False;
    end;试过了,改成这样也不行。
      

  4.   

    很奇怪的问题,APPLICATION的ONMINIMIZE已经设置成功了的,但第二次最小化时居然没触发这个事件……继续研究……
      

  5.   

    看一看Forms.pas就清楚了。
    在TApplication.Minimize;中有  if not IsIconic(FHandle) then 。
    再看看
        property ShowMainForm: Boolean read FShowMainForm write FShowMainForm;
    看,他只是赋值,而没有做什么操作。所有显示和隐藏Form用ShowMainForm可以吗?
      

  6.   

    不要用  Application.OnMinimize 事件!!!!
    事件不是链形只能产生一次,或者说,只能响应一次
    直接截取最小化消息!
      

  7.   

    这里是响应最小化消息的方法:回复人:rh(强硬的毛主席万岁!伟大的周总理万岁!) (2001-4-19 23:11:00)  得40分 
    我现写了一个,你看看:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type
      TForm1 = class(TForm)
      private
        { Private declarations }
        procedure WMSysCommand(var Message: TWMSysCommand); message WM_SysCommand;//在这里定义消息映射函数
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
    begin
      if message.CmdType = SC_MINIMIZE then
      begin
        showMessage('hahahaha!!!我靠!!!有本事你最小化我啊!!!!!');
        //在这里做你想做的
        //比如你希望的“指定最小化后的窗口的大小、位置”
      end  else
      begin
        inherited;//若不是最小化消息,就返回消息,否则拦截之
      end;
    end;end.  
      

  8.   

    这个意思:我说的:在一个程序里不能用两次,否则有一次无效
    是这个意思,就是当窗体最小化的时候,OnMinimize 只产生一次
    比如做托盘区控件,就需要监视最小化消息,若元件本身设置
    OnMinimize = myfunc;
    那么在窗体里另外有一个元件使用这个事件的时候,将不能正常完成工作。
    换言之,“事件”不是链形的,不能传递。还是比如做托盘程序,要用的监视最小化消息的方法,就是利用
    SetWindowLong函数实现。
    下面我贴出一张代码,是<c++builder4技术内幕>的代码:
    //---------------------------------------------------------------------------
    #ifndef HookComponentH
    #define HookComponentH
    //---------------------------------------------------------------------------
    #include <SysUtils.hpp>
    #include <Controls.hpp>
    #include <Classes.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class PACKAGE THookComponent : public TComponent
    {
    private:
      void __fastcall FormWndProc(TMessage& Message);
      TFarProc NewWndProc;
      TFarProc PrevWndProc;
    protected:
      void __fastcall Loaded();
    public:
      __fastcall THookComponent(TComponent* Owner);
        __fastcall ~THookComponent();
    __published:
    };
    //---------------------------------------------------------------------------
    #endif
    /---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop#include "HookComponent.h"
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    __fastcall THookComponent::THookComponent(TComponent* Owner)
            : TComponent(Owner)
    {
      NewWndProc = 0;
      PrevWndProc = 0;
      if (!ComponentState.Contains(csDesigning))
        NewWndProc = MakeObjectInstance(FormWndProc);
    }
    //---------------------------------------------------------------------------
    __fastcall THookComponent::~THookComponent()
    {
      if (NewWndProc) {
        TForm* ownerForm = dynamic_cast<TForm*>(Owner);
        if (!ownerForm)
          return;
        SetWindowLong(ownerForm->Handle, GWL_WNDPROC, (long)PrevWndProc);
        PrevWndProc = 0;
        FreeObjectInstance(NewWndProc);
      }
    }void __fastcall THookComponent::Loaded()
    {
      TComponent::Loaded();
      if (!ComponentState.Contains(csDesigning)) {
        TForm* ownerForm = dynamic_cast<TForm*>(Owner);
        if (!ownerForm)
          return;
        PrevWndProc = (void*)SetWindowLong(
          ownerForm->Handle, GWL_WNDPROC, (long)NewWndProc);
      }
    }void __fastcall THookComponent::FormWndProc(TMessage& Message)
    {
      if (Message.Msg == WM_SYSCOMMAND)
        if (Message.WParam == SC_MINIMIZE)
          ShowMessage("Main Form Minimized");
      if (PrevWndProc) {
        TForm* ownerForm = dynamic_cast<TForm*>(Owner);
        Message.Result = CallWindowProc((FARPROC)PrevWndProc,
          ownerForm->Handle, Message.Msg, Message.WParam, Message.LParam);
      }
    }
    //---------------------------------------------------------------------------
    希望有帮助^_^ 
      

  9.   

    procedure TApplication.WndProc(var Message: TMessage);
        with Message do
          case Msg of
            WM_SYSCOMMAND:
              case WParam and $FFF0 of
                SC_MINIMIZE: Minimize;
                SC_RESTORE: Restore;
              else
                Default;  
              end;
            WM_CLOSE:
    他也是一样的呀,
    你说的事件不是链形是什么意思?呵呵
      

  10.   

    这个意思:
    就最小化而言:
    当窗体最小化的时候,OnMinimize 只产生一次
    比如做托盘区控件,就需要监视最小化消息,若托盘区元件本身设置OnMinimize = myfunc;
    那么在窗体里另外有一个元件使用这个事件的时候,将不能正常完成工作。
      

  11.   

    哦,这样的呀,呵呵,名词把我搞糊涂了,是这样的,呵呵
    请看:TApplication中有这样的语句
        for I := 0 to FWindowHooks.Count - 1 do
          if TWindowHook(FWindowHooks[I]^)(Message) then Exit;
    这个可能是导致了只能一次的原因。大家可以跟踪一下。
    事件不能传递?那是你没有传递,如果我想传递怎么不可以。这个传递用的不妥,
    应该说WndProc只有一个,后面一个取代前面一个。
      

  12.   

    你是说托盘控件,那是如果他用自己的窗口过程取代了原来的WndProc就会这样,
    这个说起来太累,嘿嘿
      

  13.   

    xixi~~~他用自己的窗口过程取代了原来的WndProc就会这样
    但是他“不用”自己的窗口过程取代了原来的WndProc“也会”这样
    比如他只响应OnMinimize 
    那么第二个元件也响应OnMinimize 的话,事件就不能被触发。
      

  14.   

    说起来真的累~~~~嘿嘿
    VCL的消息处理也很麻烦的~
      

  15.   

    是呀,是这样的样,OnXXX的说白了只是一个函数指针,你只能给他赋一个值,但是这个和
    事件的传递有什么关系呢?那么什么叫事件的传递?
    Delphi中消息和事件不同。
    Windows消息->类的WndProc->类的消息处理过程->类的默认处理过程。
    事件是对消息的封装,比如对SC_MINIMIZE消息,再消息的处理过程中,有
    If Assigned(OnMin....) then ......
    每个都是这样的。你说的事件的传递是什么?呵呵
      

  16.   

    我同意kxy(手举穿肠毒药,怀抱刮骨钢刀)的,他说“你是说托盘控件,那是如果他用自己的窗口过程取代了原来的WndProc就会这样”,我也发现是这个问题……如果没写其他东西,只相应ONMINIMIZE的话就没问题……