Windowsのシャットダウンを検出する方法

解決


komin  2007-02-08 02:37:00  No: 24823

TrayIconコンポーネントを使って常駐するプログラムを作っています。内容はタイマーイベントで一定時間おきに処理をするものです。起動するとタスクトレイに常駐するようになりましたが、このままWindowsをシャットダウンしようとするとシャットダウンできません。このプログラムを終了しておけば正常にシャットダウンできます。プログラム側でシャットダウンされたことを検知して自分自身を終了するような処理をしたいと思います。どうしたらよいでしょうか?


Fusa  2007-02-09 08:57:53  No: 24824

そういうアプリよく書きますが、
普通にシャットダウンできると思いますよ。

どういうコード書いてます?

とりあえずシャットダウンを検知できるようにするには
こんな感じでしょう。

もしかしたら、Formを使わないアプリケーションになっているのかな?

  TMainForm = class(TForm)
  private
    FQueryEndSession: Boolean;
    FEndSessionLogOff: LongInt;
    procedure WMQueryEndSession(var Msg: TWMQueryEndSession); message WM_QUERYENDSESSION;
  public
    { Public 宣言 }
  end;

procedure TMainForm.WMQueryEndSession(var Msg:TWMQueryEndSession);
begin
  FQueryEndSession := true;
  FEndSessionLogOff := Msg.Unused;
  inherited;
end;

procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin

  if FQueryEndSession then begin
    FQueryEndSession := false;
    if (FEndSessionLogOff and ENDSESSION_LOGOFF) <> 0 then
    begin
      // ログオフ要求時の処理
      WriteFileRunningTimeData('プログラム終了'+TAB+'ログオフ');
    end
    else begin
      // シャットダウン要求時の処理
      WriteFileRunningTimeData('プログラム終了'+TAB+'シャットダウン');
    end;
  end
  else begin
    // 上記以外でフォームを閉じる要求時の処理
      WriteFileRunningTimeData('プログラム終了'+TAB+'通常');
  end;

  if CanClose then
  begin
  end;
end;


komin  2007-02-11 05:03:10  No: 24825

Fusaさん、ありがとうございます。シャットダウンやログオフを検知する方法は大変勉強になりました。
  で、問題の元に戻りますが、CloseQueryにCanClose := falseが書いてあったのが原因とわかりました。このメソッドはWindowsのシャットダウンすら妨げる強力さがあるんですね。教えていただいた情報と共に記録しておきます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加