代码之家  ›  专栏  ›  技术社区  ›  SimaWB

防止Windows关闭

  •  6
  • SimaWB  · 技术社区  · 14 年前

    为了检测和防止关机,我使用了非常简单的程序。它只有一个窗体和一个私有过程,如下所示:

    TForm3 = class(TForm)
    private
      procedure WMQueryEndSession(var Msg : TWMQueryEndSession) ;
             message WM_QueryEndSession;
    end;
    

    以及实施

    procedure TForm3.WMQueryEndSession(var Msg: TWMQueryEndSession);
    begin
      Msg.Result := 0; //so I don't want to shutdown while my program is running
    end;
    

    如何从这两个方面得到相同的结果?

    7 回复  |  直到 10 年前
        1
  •  0
  •   Alex    14 年前

        2
  •  2
  •   David Heffernan    13 年前

    编辑:改为截获WM\u ENDSESSION而不是WM\u QUERYENDSESSION。

    由于不能直接更改TApplication的行为,因此可以安装一个TApplication消息钩子来中和WM\u ENDSESSION消息。

    安装这样一个钩子非常简单,只需在mainform中添加一个类似于下面的方法,并在FormCreate中注册钩子。

    function TForm25.HookEndSession(var Message: TMessage): Boolean;
    begin
      result := false;
      if Message.Msg = WM_ENDSESSION then begin
        Message.Result := 0;
        result := true;
      end;
    end;
    
    procedure TForm25.FormCreate(Sender: TObject);
    begin
      Application.HookMainWindow(HookEndSession);
    end;
    
        3
  •  1
  •   opal    14 年前

    当做

        4
  •  0
  •   Chris Thornton    14 年前

    编辑:这里有一种方法行不通。谢谢

    Procedure TMyForm.FormClose(Sender: TObject;  Var Action: TCloseAction);
    Begin
      Action := caNone;  //The form is not allowed to close, so nothing happens.
    End;                 // Note: the OP says he tried this, doesn't help. See the comments.
    
        5
  •  0
  •   The_Fox    14 年前

    你在同一个操作系统上测试吗?Vista中有一些应用程序关闭更改。请阅读以下内容: Application Shutdown Changes in Windows Vista

        6
  •  0
  •   Despatcher    14 年前

    在所有版本中,您不应该使用FormCloseQuery事件吗?

    procedure TForm3.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
      Canclose := Not StillDoingImportantStuff;
    end;
    

    哦-看看“这不管用”的评论(Win7有什么不同吗?

    在我所有的应用程序中,如果windows试图关闭,就会调用这个。。。

        7
  •  0
  •   Mohammed Nasman    14 年前