防止Windows关闭

时间:2010-06-21 13:59:20

标签: delphi shutdown windows-messages

要检测并阻止关机,我使用非常简单的程序。它只有一个表单和一个私有程序,如下所示:

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;

我编译了Delphi 5和Delphi 2010.它们都检测到了关机。但是当我在Delphi 2010中编译时;在阻止关机后我的程序关闭。 (PC不关机)

如何从两者中获得相同的结果?

7 个答案:

答案 0 :(得分:2)

编辑:更改为拦截WM_ENDSESSION而不是WM_QUERYENDSESSION。

由于您无法直接更改TApplication的行为,您可以安装TApplication消息挂钩,而不是中和WM_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;

答案 1 :(得分:1)

我经常运行“shutdown -a”命令。您可以从代码中执行相同的操作,从关闭中断Windows。

此致

答案 2 :(得分:0)

编辑:这是一种不起作用的方法。谢谢

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.

答案 3 :(得分:0)

您是否在相同的操作系统上进行测试? Vista中有一些应用程序关闭更改。阅读:Application Shutdown Changes in Windows Vista

如果您在同一个操作系统上进行测试,Delphi 2010可能会以不同的方式处理WM_ENDSESSION消息。在Delphi 7中,WM_ENDSESSION消息在Application.WndProc中处理。

答案 4 :(得分:0)

这看起来像是Delphi中的一个错误。我建议你将它发布在Quality Central上。

答案 5 :(得分:0)

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

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

糟糕 - 只是阅读评论“这不起作用”:(胜利7是不同的?

在我的所有应用程序中,如果Windows试图关闭,则会调用它...

答案 6 :(得分:0)

ShutdownGuard是用Delphi构建的,它是开源的,你可以下载它来调整它以满足你的需求