6

コンピューターのシャットダウンを検出して防止するために、私は非常に単純なプログラムを使用しています。以下のように、1 つのフォームと 1 つのプライベート プロシージャしかありません。

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はシャットダウンしません)

両方から同じ結果を得るにはどうすればよいですか?

4

7 に答える 7

2

編集:WM_QUERYENDSESSIONの代わりにWM_ENDSESSIONをインターセプトするように変更されました。

TApplicationの動作を直接変更することはできないため、代わりにWM_ENDSESSIONメッセージを無効にするTApplicationメッセージフックをインストールできます。

このようなフックのインストールは非常に簡単です。メインフォームに次のようなメソッドを追加し、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

同じOSでテストしていますか?Vistaにはいくつかのアプリケーションシャットダウンの変更があります。これを読んでください:WindowsVistaでのアプリケーションシャットダウンの変更

同じOSでテストしている場合、Delphi2010はWM_ENDSESSIONメッセージを別の方法で処理する可能性があります。Delphi 7では、WM_ENDSESSIONメッセージはApplication.WndProcで処理されます。

于 2010-06-21T14:50:52.937 に答える
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

ShutdownGuardは Delphi で構築されており、オープン ソースです。必要に応じてダウンロードして調整できます。

于 2010-06-23T15:29:27.660 に答える
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は違いますか?

私のすべてのアプリで、ウィンドウがシャットダウンしようとすると、これが呼び出されます...

于 2010-06-21T20:19:14.110 に答える