要检测并阻止关机,我使用非常简单的程序。它只有一个表单和一个私有程序,如下所示:
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不关机)
如何从两者中获得相同的结果?
答案 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构建的,它是开源的,你可以下载它来调整它以满足你的需求