一个窗体,我点叉叉键关闭和右键单击任务栏关闭,所触发的消息难道不一样吗??
前一种情况我用WM_CLOSE能处理到,可是后一种就不知道了!而且我用一个消息处理方法来处理WM_CLOSE的时候,老是提示栈溢出,我搞不懂!我怎样才能把上述两个消息都处理到而不出错呢?

解决方案 »

  1.   

    初步代码如下:
    if Application.MessageBox('你要退出吗?', '确定', MB_OKCANCEL + MB_ICONERROR) = IDOK then
        Inherited
      else
        Abort;
      

  2.   

    应该是处理
    WM_SYSCOMMAND当wParam = SC_CLOSE就是 窗口关闭
      

  3.   

    你可以在FormCloseQuery事件中加入if Application.MessageBox('你要退出吗?', '确定', MB_OKCANCEL + MB_ICONERROR) = IDOK then
      CanClose := true
    else
      CanClose := false;
      

  4.   

    hch_45(HCH ~ahong.net~)高手的意思我懂,但是由于某些特殊情况,我必须得用消息得方法来处理!
      

  5.   

    我改成这样也不行啊!哪里错了?
    procedure TForm1.WMSYSCOMMAND(var Msg: TWMSYSCOMMAND);
    begin
      if Msg.Msg = SC_CLOSE then
      begin
        if Application.MessageBox('你要退出吗?', '确定', MB_OKCANCEL + MB_ICONERROR) = idok then
          Inherited
        else
          Abort;
      end;
    end;
      

  6.   

    procedure TForm1.WMSYSCOMMAND(var Msg: TWMSYSCOMMAND);
    begin
      if Msg.wParam = SC_CLOSE then
      begin
        if Application.MessageBox('你要退出吗?', '确定', MB_OKCANCEL + MB_ICONERROR) = idok then
          Inherited
        else
          Abort;
      end;
    end;
      

  7.   

    private
        { Private declarations }
        procedure WMSysCommanda(var Msg: TMsg; var Handled: Boolean);
      ...procedure TfrmFir.FormCreate(Sender: TObject);
    begin
      Application.OnMessage := WMSysCommanda;
      ...
    end;
    ...
    procedure TfrmFir.WMSysCommanda(var Msg: TMsg; var Handled: Boolean);
    begin
      if Msg.wParam = SC_CLOSE then 
    begin
        if Application.MessageBox('你要退出吗?', '确定', MB_OKCANCEL + MB_ICONERROR) = idok then
          Inherited
        else
          Abort;
      end;
    end;
      

  8.   

    重要的是, 这样两个消息的处理过程是不一样的.
    一个发送向Application, 而一个是发向Form...可以通过对Application的消息处理实现 .