6

为了检测和防止关闭计算机,我使用了非常简单的程序。它只有一种形式和一种私有程序,如下所示:

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 中编译时;阻止关闭后,我的程序关闭。(电脑不关机)

我如何从他们两个那里得到相同的结果?

4

7 回答 7

2

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

由于您不能直接更改 TApplication 的行为,因此您可以安装一个 TApplication 消息挂钩来中和 WM_ENDSESSION 消息。

安装这样的钩子非常简单,您只需在主窗体中添加类似以下的方法并在 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;
于 2010-06-21T16:22:05.083 回答
1

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

问候

于 2010-06-23T13:33:39.727 回答
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.
于 2010-06-21T14:12:18.217 回答
0

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

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

于 2010-06-21T14:50:52.937 回答
0

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

于 2010-06-21T19:37:09.537 回答
0

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

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

糟糕 - 只需阅读“这不起作用”的评论 :( win 7 不同吗?

在我所有的应用程序中,如果 Windows 试图关闭,这将被调用......

于 2010-06-21T20:19:14.110 回答
0

ShutdownGuard是用 Delphi 构建的,它是开源的,你可以下载它来根据你的需要调整它

于 2010-06-23T15:29:27.660 回答